🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #216896

Re: kolejne pytanie z pythona

#216896
From: Piotr Chamera
Date: Wed, 15 Apr 2020 19:14
62 lines
3353 bytes
W dniu 2020-04-15 o 02:58, fir pisze:
> (...)> 
> jesli jest to decode to moge zapisywac wpisy na dysk i moge je czytac ze slowniek i wyswietlac na kanal - ale tylko poki nie zamkne bota i nie wczytam tego z dysku, wtedy przy probie odczytania wpisu i wyslania go na kanal z tego leci blad (ascii codect cant encode...)
> 
> z kolei jak to decode wywale jest
> odwrotnie, po uruchomieniu boyta moge
> wysylac zapisane za poprzednim razem wpisy na kanal ale nie moge zapisac i odczytac nowego, tj dokladniej w pliku tez sie zapisuje ale odczytanie go ze slownika i proba poslania na kanal dale blad (ascii codec cant decode...)
> 
> o co tu chodzi? jak to naprawic?

Zwróć uwagę, że w pythonie 2.x są dwa rodzaje stringów: ośmiobitowe 
(bajtowe) i unikodowe, a z jednych na drugie przechodzisz przez encode() 
i decode().
Jeśli nie zachowasz dyscypliny i nie wiesz jakie kodowania masz w 
poszczególnych stringach bajtowych, to dzieją się „cuda” o których 
piszesz wyżej.


przykład:

Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 
64 bit (AMD64)] on win32

 >>> import sys
 >>> sys.stdin.encoding # sprawdzamy jakie jest domyślne kodowanie konsoli
'cp1250'

 >>> s1 = "aą" # zwykły ośmiobitowy string, kodowanie cp1250
 >>> s2 = u"aą" # string unicode, automatycznie przekodowany z konsoli 
na unicode

 >>> s1
'a\xb9'

 >>> s2
u'a\u0105'

s1 nie „pamięta” swojego kodowania, można go dowolnie zinterpretować

 >>> s1.decode(encoding="cp1250")
u'a\u0105'

 >>> s1.decode(encoding="iso8859-2")
u'a\u0161'

 >>> s1.decode(encoding="cp1256")
u'a\xb9'

s2 też można „spaprać”, jeśli się go przepuści przez niekompatybilne
kodowania bajtowe, np.:

 >>> s2.encode(encoding="utf8").decode(encoding="cp1250")
u'a\xc4\u2026'
 >>> print s2.encode(encoding="utf8").decode(encoding="cp1250")
aÄ…


Rozwiązanie problemu jest takie jak w innych językach:
- znać kodowania wejściowe
- dekodować wejścia do jednego wspólnego dla całej aplikacji kodowania 
(najczęściej unicode, ewentualnie utf-8) i na nim pracować
- znać kodowania wyjściowe i wyjścia kodować odpowiednio do wymagań
Technical Details
Message-ID: <r77iu7$q51$1@dont-email.me>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!weretis.net!feeder7.news.weretis.net!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
References: <d5088c9e-aa2f-46b5-bca7-7c340b1618e6@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!weretis.net!feeder7.news.weretis.net!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
From: Piotr Chamera <piotr_chamera@poczta.onet.pl>
Newsgroups: pl.comp.programming
Subject: Re: kolejne pytanie z pythona
Date: Wed, 15 Apr 2020 21:14:29 +0200
Organization: A noiseless patient Spider
Lines: 62
Message-ID: <r77iu7$q51$1@dont-email.me>
References: <d5088c9e-aa2f-46b5-bca7-7c340b1618e6@googlegroups.com>
Mime-Version: 1.0
Injection-Date: Wed, 15 Apr 2020 18:14:31 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="177ff2419742efb0783d7787b8aca387"; logging-data="26785"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/o6bwhSp+ZVQIXZWA9xvGe"
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0
Cancel-Lock: sha1:dkNyo/cX6D2xqO3zre/CGJ4OSl4=
In-Reply-To: <d5088c9e-aa2f-46b5-bca7-7c340b1618e6@googlegroups.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit