-
Data: 2020-04-15 21:14:29
Temat: Re: kolejne pytanie z pythona
Od: Piotr Chamera <p...@p...onet.pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]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ń
Następne wpisy z tego wątku
- 15.04.20 21:27 Piotr Chamera
- 17.04.20 21:04 Maciej Sobczak
Najnowsze wątki z tej grupy
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
- Press Release - AEiC 2023, Ada-Europe Reliable Softw. Technol.
- Ada-Europe - AEiC 2023 early registration deadline approaching
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2023
- Ile cykli zajmuje mnożenie liczb 64-bitowych?
- Ideologia Polskiego Programisty wer.3
Najnowsze wątki
- 2024-04-27 Nowy, "szybki "komputer AsRock nie posiada modułu TPM
- 2024-04-27 Nowy, "szybki "komputer AsRock nie posiada modułu TPM
- 2024-04-27 Warszawa => Inżynier DevOps (projekt JP) <=
- 2024-04-27 Warszawa => Senior Account Manager (on-site) <=
- 2024-04-27 Wrocław => Dyrektor Sprzedaży (branża usług/produktów IT) <=
- 2024-04-27 Warszawa => Sales Representative for Outsourcing Services <=
- 2024-04-27 Chrzanów => Administrator i wdrożeniowiec Lotus Notes/Domino <=
- 2024-04-27 Ja pierdolę...
- 2024-04-27 Ryby i kawitacja
- 2024-04-27 Zabrze => Junior HelpDesk <=
- 2024-04-27 Katowice => Administrator IT - Wirtualizacja i Konteneryzacja <=
- 2024-04-27 Bażanowice => Inżynier Industrializacji - Elektronik <=
- 2024-04-27 Warszawa => Full Stack web developer (obszar .Net Core, Angular6+) <=
- 2024-04-27 Zadaszenie tarasu, a wymagany spadek
- 2024-04-27 Warszawa => Senior Account Manager <=