Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kodowanie stringu pod windows i linux

126 views
Skip to first unread message

Michal M

unread,
Dec 22, 2009, 4:52:12 PM12/22/09
to
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!

Rob Wolfe

unread,
Dec 22, 2009, 5:04:59 PM12/22/09
to
Michal M <mie...@swietochlowice.org> writes:

> 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

Łukasz Rekucki

unread,
Dec 22, 2009, 5:29:20 PM12/22/09
to
W serii 2.x "ąć" to nie napis unicode, więc encode (poza np. base64)
nie ma sensu dla ciągu bajtów. u"ąć" to jest napis unicode.

Michal M

unread,
Dec 23, 2009, 1:57:20 AM12/23/09
to
On 22 Gru, 23:04, Rob Wolfe <r...@smsnet.pl> wrote:
> Michal M <mier...@swietochlowice.org> writes:
> > 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'.

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).

Michal M

unread,
Dec 23, 2009, 1:58:48 AM12/23/09
to
> nie ma sensu dla ciągu bajtów. u"ąć" to jest napis unicode.- Ukryj cytowany tekst -
>
> - Pokaż cytowany tekst -

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.

Michal M

unread,
Dec 23, 2009, 2:07:38 AM12/23/09
to
> Nie mogę dodać 'u' przed nazwą zmiennej raczej.- Ukryj cytowany tekst -

>
> - Pokaż cytowany tekst -

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.

Gallus Anonimus

unread,
Dec 23, 2009, 3:36:21 AM12/23/09
to
On Tue, 22 Dec 2009 22:58:48 -0800 (PST), Michal M
<mmie...@tycowaterworks.pl> wrote:

>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')

Filip Wasilewski

unread,
Dec 23, 2009, 3:49:04 AM12/23/09
to
On Dec 23, 8:07 am, Michal M <mmier...@tycowaterworks.pl> wrote:
> 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")

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/

Artur M. Piwko

unread,
Dec 23, 2009, 3:18:22 AM12/23/09
to
In the darkest hour on Tue, 22 Dec 2009 22:58:48 -0800 (PST),
Michal M <mmie...@tycowaterworks.pl> screamed:

>> > To samo ze shella pythona (puszczony w utf-8)
>> > "ĄĆ".encode("windows-1250")
>>
>> W serii 2.x "ąć" to nie napis unicode, więc encode (poza np. base64)
>> nie ma sensu dla ciągu bajtów. u"ąć" to jest napis unicode.- Ukryj cytowany tekst -
>
> Czyli muszę dodać u" mimo, iż napis jest w unicode.

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.

Michal M

unread,
Dec 23, 2009, 5:04:17 AM12/23/09
to
On 23 Gru, 09:18, "Artur M. Piwko" <milusi.pysiac...@buziaczek.pl>
wrote:

> In the darkest hour on Tue, 22 Dec 2009 22:58:48 -0800 (PST),
> Michal M <mmier...@tycowaterworks.pl> screamed:

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.

ethanak

unread,
Dec 23, 2009, 11:20:37 AM12/23/09
to
Dnia Wed, 23 Dec 2009 02:04:17 -0800, Michal M napisał(a):

[...]


>
> 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!

William Bonawentura

unread,
Dec 30, 2009, 2:03:26 AM12/30/09
to

U�ytkownik "Gallus Anonimus" <gallusnnms@na_gmailu.com> napisa� w wiadomo�ci
news:sdl3j59muoire1dn8...@4ax.com...

>
> import codecs
> f = codecs.open("plik.txt","r","utf-8")
> txt = f.read()
> f.close()
>

import codecs
with codecs.open("plik.txt","r","utf-8") as f:
txt = f.read()

0 new messages