Nejjednodušší je to převést nejdříve do Unicode a druhým krokem do požadovaného
kódování. Tohle jsem dělal pod Windows na konzoli, která používá cp852:
u = uě š č ř
u
u'\u011b \u0161 \u010d \u0159'
s = u.encode('utf-8')
s
'\xc4\x9b \xc5\xa1 \xc4\x8d \xc5\x99'
u2 = s.decode('utf-8')
u2
Děkuji, ale nechápu, jak proměnné říct, že už obsahuje text v kódování UTF8.
Mám proměnnou, která obsahuje 'Ă˝ á Ă Ă.' tedy přesněji, toto je ve
windowsech vidět, když si zobrazíte utf8 v cp1250. Python mám ale na Linuxu
v LANG=cs_CZ.iso8859-2. Ty znaky v UTF8 tam jdou binárně zvenčí a nevím
Dobrý den,
pokud v proměnné s máte 'Ă˝ á Ă Ă.', pak zavoláním u = s.decode(utf8) z
toho dostanete unicode řetězec. S ním pak můžete dále pracovat nebo ho převést
do jiného kódování. Pokud ho chcete zobrazit na Windows v kódování cp1250,
zkuste u.encode(cp1250).
Je nutné si uvědomit, ze
Chtěl bych to udělat systémově, než na ten vstup poštvat 50x replace.
Jestli tím replace myslíš decode :-), tak to jde, v modulu codecs je
wrapper nad voláním open() který provádí transparentní překódování:
In [21]: codecs.open(test,r, utf8).read()
Out[21]: u'\u0161\u010d\u0159\u017e\n'
Jenže právě toto nějak nejde, řve na tom ř:
s='Ă˝ á Ă Ă.'
u = s.decode(utf8)
Traceback (most recent call last):
File stdin, line 1, in ?
File /var/zope/python/lib/python2.4/encodings/utf_8.py, line 16, in
decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError:
Pokud jste do programu napsal
s='Ă˝ á Ă Ă.'
u = s.decode(utf8)
Pak musíte ten zdrojový kód uložit v kódování, pro které to bude fungovat a
toto kódování deklarovat v hlavičce (-*- coding: cp1250). Možná bude lepší
pracovat s hexadecimalnim zápisem těchto znaků, abychom se podobným
Ten nečitelný řetězec je zapsaný ve zdrojovém textu, nebo je načtený ze souboru?
Když mám v proměnné UTF-8 bajty, tak musím udělat .decode() nebo unicode(),
ale jako parametr musím uvést to 'utf-8'.
Posloupnost bajtů v kódovaní UTF-8 je jednou z možných reprezentací Unicode
řetězce. Vznikla
Je to proměnná, kde obsah byl získaný ze streamu dat.
a='Ă˝ á Ă Ă.'
repr(a)
'\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'
Dík, JL.
- Původní zpráva -
Od: Petr Přikryl prik...@atlas.cz
Ten nečitelný řetězec je zapsaný ve zdrojovém textu, nebo je načtený ze
souboru?
Když mám v
Já vidím tohle:
rr = '\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'
a = eval(rr)
a
'\xc3\xbd \xc3\xb7 \xc3\xad \xc3.'
u = a.decode('utf-8')
Traceback (most recent call last):
File stdin, line 1, in module
File c:\Python27\lib\encodings\utf_8.py, line 16, in decode
return
Mezitím jsme v jiném threadu zjistili, že jde o utf8 zapsané v cp1250, ale i
tak mám tohle - Python 2.4.6:
a='Ă˝ á Ă Ă.'
repr(a)
'\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'
a.decode(cp1250)
u'\u0102\u02dd \u0102\xb7 \u0102\xad \u0102.'
print eval(a).decode(cp1250)
Traceback (most recent
Ono to možná nikam nevede. Bez posledních dvou znaků je to OK:
print \xC3\xBD \xC3\xB7 \xC3\xAD.decode(utf8)
ý ÷ í
Ono za \xC3 musí z definice UTF-8 následovat bajt, který má nastavený
nejvyšší bit, a to obyčejná tečka není snad v žádném kódování, rozhodně v
žádném založeném na ASCII jako je
Myslím že jsem to zkopíroval celé, ale mohlo mi něco utéct. Jenže teď to mám
z uložených poznámek v PSpadu, tak ten do toho taky kecal a teď je to úplně
jinak, než to co jsem v pondělí kopíroval přímo do promptu, ach jo.
No nic, musím to znova vygenerovat.
- Původní zpráva -
Od:
Tento problém vzniká, když je text převeden do lokálního kódování dvakrát.
# výchozí text:
ě š č ř
'\xc4\x9b \xc5\xa1 \xc4\x8d \xc5\x99'
# Tady se text chybně považuje za unicode:
text = u'\xc4\x9b \xc5\xa1 \xc4\x8d \xc5\x99'.encode(utf8)
# a takovou to pak udělá paseku:
text
Děkuji za konstruktivní odpověď.
1) Opravdu mi na jednom místě u close chyběly závorky :-)
2) Postup pomocí atexit jsem použil podle zvyku z bash-e.
Ale python nezavírá soubory před atexit funkcí, jak jsem se mylně domníval.
3) Přepsal jsem to na 'with open(...) as ...'
nebo 'try ...
5) Nakonec jsem musel před rušením dočasného adresáře ponechat
time.sleep(1). Jinak nastávala chyba: adresář není prázdný
Možná už není potřeba do toho nějak šťourat, ale tohle je divný. Jak
přesně se ten dočasný adresář ruší (maže)?
Ruším pomocí shutil.rmtree(...) .
Když se do něj
Aha, toto by byla cesta. Jenže mě to překóduje cp1250 (tak to jde do
browseru) přes utf8 (tak to jde z browseru), to chytnu a pošlu do browseru
zpět jako cp1250 a ten zmetek co od něj pak dostanu vypadá takhle:
vstup, který projde ttímto mlýnem: 'ě š č ř' a výstup:
a='Ă˝ á Ă Ă.'
a
16 matches
Mail list logo