/ / Konverzia reťazca unicode na utf-8 - python, unicode, kódovanie, utf-8

Konverzia reťazca unicode na utf-8 - python, unicode, kódovanie, utf-8

Po prvé, uvedomujem si, že existuje veľa otázok týkajúcich sa en / de-kódovania reťazcov v Pythone 2.x, ale nemôžem nájsť riešenie tohto problému.

Mám unicode reťazec, ktorý obsahuje list č ktorý je zastúpený ako u00c4u008d

Ak píšu v konzole Python

>>> a = u"u00c4u008d"
>>> print a

Dostávam namiesto toho dve vytlačené znaky č, pravdepodobne preto, že skutočné kódovanie tohto reťazca má byť utf-8. Preto sa snažím použiť .decode("utf-8") ale za to dostanem štandard UnicodeEncodeError.

Viete, ako môžem urobiť, aby Python tlačil tento reťazec ako č v konzole?

Mnohokrat dakujem

odpovede:

1 pre odpoveď č. 1

č nie je zastúpená u"u00c4u008d", Tieto dve hexadecimálne hodnoty sú utf-8 kódované hodnoty, takže by mali byť napísané v bajtovom reťazci ako "xc4x8d", Príklad:

>>> s = "xc4x8d"
>>> s.decode("utf8")
u"u010d"
>>> print(s.decode("utf8"))
č

Upozornenie: Terminál musí byť nakonfigurovaný s kódovaním, ktoré podporuje správne tlačenie znaku, alebo uvidíte znak a UnicodeEncodeError.

Ak z nejakého dôvodu máte nesprávne dekódovaný reťazec Unicode, môžete využiť skutočnosť, že prvých 256 kódových bodov v Unicode koreluje s latin1 kódovanie a opravu:

>>> s = u"u00c4u008d"
>>> s.encode("latin1")
"xc4x8d"
>>> s.encode("latin1").decode("utf8")
u"u010d"
>>> print(s.encode("latin1").decode("utf8"))
č

Ak máte nesprávne dekódovaný reťazec Unicode, mali by ste zobraziť súbor, ktorý máte, alebo kód, ktorý ho čítal a vyriešiť tento problém.


0 pre odpoveď č. 2

Po bojoch s Pythonom viac ako hodinu som sa rozhodol nájsť riešenie v inom jazyku. Takto môžem dosiahnuť môj cieľ v C #:

var s = "u00c4u008d";
var newS = Encoding.UTF8.GetString(Encoding.Default.GetBytes(s));
File.WriteAllText(@"D:tmptest.txt", newS, Encoding.UTF8);

Konečne! Súbor teraz obsahuje č.

Preto som sa inšpiroval týmto prístupom v C # a podarilo sa mi nájsť nasledujúce (zdanlivo) ekvivalentné riešenie v Pythone:

>>> s = u"u00c4u008d"
>>> arr = bytearray(map(ord, s))
>>> print arr.decode("utf-8")
č

Nie som si istý, ako dobré je toto riešenie, ale zdá sa, že funguje v mojom prípade.