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.