Mam program który string unicode koduje do innych formatów (nie
wypisuje tego) (windows-1250 i iso-5589-2). Pod Windows wszystko
działa, pod Linux wywala błąd na txt.encode("windows-1250","replace")
(i iso pewnie też):
File "/usr/local/lib/python2.6/encodings/cp1250.py", line 12, in
encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position
3: ordinal not in range(128)
To samo ze shella pythona (puszczony w utf-8)
"ĄĆ".encode("windows-1250")
Pomocy!
> Witam,
>
> Mam program kt�ry string unicode koduje do innych format�w (nie
> wypisuje tego) (windows-1250 i iso-5589-2). Pod Windows wszystko
> dzia�a, pod Linux wywala b��d na txt.encode("windows-1250","replace")
> (i iso pewnie teďż˝):
>
> File "/usr/local/lib/python2.6/encodings/cp1250.py", line 12, in
> encode
> return codecs.charmap_encode(input,errors,encoding_table)
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position
> 3: ordinal not in range(128)
>
> To samo ze shella pythona (puszczony w utf-8)
> "��".encode("windows-1250")
>
>
> Pomocy!
Kodowanie zale�y od ustawie� lokalizacji w systemie.
Na Windzie pewnie mia�e� ustawione 'cp1250' albo 'iso-8859-2',
a pod Linuksem zapewne masz 'UTF-8'.
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> '��'.encode('cp1250')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/encodings/cp1250.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
>>> '��'.decode('utf-8').encode('cp1250')
'\xa5\xc6'
Prawid�owo zawsze przed zakodowaniem jakiego� tekstu musisz
go odkodowaďż˝ (a najlepiej mieďż˝ wszystko w unikodzie)
i *TY* programista musisz wiedzieďż˝ w jakim ten tekst jest kodowaniu,
a nie Python.
RW
Nie. Na Windzie też leciało spod UTF-8 bo odpalane z Eclipse.
>
> >>> import sys
> >>> sys.stdin.encoding
> 'UTF-8'
> >>> 'ĄĆ'.encode('cp1250')
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/usr/lib/python2.5/encodings/cp1250.py", line 12, in encode
> return codecs.charmap_encode(input,errors,encoding_table)
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)>>> 'ĄĆ'.decode('utf-8').encode('cp1250')
>
> '\xa5\xc6'
>
> Prawidłowo zawsze przed zakodowaniem jakiegoś tekstu musisz
> go odkodować (a najlepiej mieć wszystko w unikodzie)
> i *TY* programista musisz wiedzieć w jakim ten tekst jest kodowaniu,
> a nie Python.
Ależ ja doskonale wiem co w czym mam i tylko próbuję przekonać Pythona
aby to przekonwertował na to co chcę mieć.
Wszystkie stringi mam w unicode i konwertuje przed wysłaniem na inne
formaty (albo zostawiam w unicode).
Czyli muszę dodać u" mimo, iż napis jest w unicode. Ok, a jak to
zrobić ze stringami wczytywanymi z pliku?
Nie mogę dodać 'u' przed nazwą zmiennej raczej.
Hmm z pierwszych prób, zgaduję, (mając na uwadze obie Wasze
odpowiedzi), że jeśli mam tekst w zmiennej i jest on w unicode to
muszę najpierw powiedzieć pythonowi, że jest w unicode a później
dopiero zakodować? To by wyglądało tak
a = "ĄĆ"
print a.decode("utf-8").encode("windows-1250")
Powalczę z tym. Wszelkie uwagi mile widziane i dziąkuję Wam za
odpowiedzi.
>Czyli muszďż˝ dodaďż˝ u" mimo, iďż˝ napis jest w unicode. Ok, a jak to
>zrobiďż˝ ze stringami wczytywanymi z pliku?
>Nie mogďż˝ dodaďż˝ 'u' przed nazwďż˝ zmiennej raczej.
tak?
import codecs
f = codecs.open("plik.txt","r","utf-8")
txt = f.read()
f.close()
print type(txt)
print txt.encode('windows-1250')
Małe uściślenie - UTF8 to nie jest Unicode, tylko sposób reprezentacji
Unicode/UCS jako ciągu bajtów [1].
[1] http://unicode.org/faq/utf_bom.html#gen2 - What is a UTF?
Filip Wasilewski
http://filipwasilewski.pl/
Tekst nie jest w unicode, a w UTF-8.
> Ok, a jak to
> zrobić ze stringami wczytywanymi z pliku?
> Nie mogę dodać 'u' przed nazwą zmiennej raczej.
text = unicode(spam, 'utf-8').decode('windows-1250')
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:232B ]
[ 09:17:15 user up 12295 days, 21:12, 1 user, load average: 0.30, 0.81, 0.27 ]
Every dog has its day, but the nights belong to the pussycats.
Dziękuję za odpowiedzi.
a = "Łóżko"
print a.decode("utf-8").encode("windows-1250")
i
b = u"Łóżko"
print b.encode("windows-1250")
Działają tak samo i to chyba wystarczy.
[...]
>
> Dziękuję za odpowiedzi.
>
> a = "Łóżko"
> print a.decode("utf-8").encode("windows-1250")
>
> i
>
> b = u"Łóżko"
> print b.encode("windows-1250")
>
> Działają tak samo i to chyba wystarczy.
A co masz w #coding?
ethanak
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://milena.polip.com/ - nie czekam na Ivo!
import codecs
with codecs.open("plik.txt","r","utf-8") as f:
txt = f.read()