Article View: pl.comp.lang.python
Article #27521Re: String, unicode, dziwny problem i 5 pytań - długie
From: Piotr Pastuszka
Date: Wed, 16 Jun 2010 19:30
Date: Wed, 16 Jun 2010 19:30
138 lines
7371 bytes
7371 bytes
Witam
Jestem początkujący (niecałe 2 tyg interesowania Pythonem). Używam WinXP i
czysty python.
Czytałem trochę, na poczatku spróbowałem 3.1 i tam wszystko unicode.
Niestety ze wzgledów na moduły (dostępne tylko w 2.x) (to temat na innš
rozmowę) zrezygnowałem z 3.1 i zainstalowałem 2.65.
Ale pomny na powyższe przyjąłem zasadę kodowania wszystkich źródeł w
utf-8.(w każdym edytorze to ustawiałem) do tego na poczštku pliku tworzyłem
nagłówek #-*- coding:utf-8 -*- czyli np nakrótszy przykład to
(wykorzystam w dalszej części)
"
#-*- coding:utf-8 -*-
print ("Gotówka wysłane")
"
Przy okazji testowałem różne edytory i okazało się, że niektóre (np SPE,
PyCharm, DreamPie-w tym nie ustawia kodowania) powyższy kod po uruchomieniu
poprawnie wywietlajš z polskimi znaczkami. To samo, gdy uruchomię
bezporednio z cmd.exe i przekierowuje wynik do pliku. Zawartoc tego pliku
notatnik wywietlał mi poprawnie z polskimi znaczkami.
Niestety inne edytory (NetBeans, PyScripter, WingIDE, starsze wersje SPE),
taki po uruchomieniu wywietlały z "dziwnymi znaczkami".
Traktowałem to jako ich wadę (że majš złš obsługe unicode). (bo przecież pod
czystym pythonem było OK!!)
W pracy na moim kompie ten sam kod chodził mi jak w domu, czyli w sposób
pożšdany. Kod pisałem dla potrzeb innych.
Więc inne osoby uruchomiły ten kod z poziomu cmd.exe
(a dokładnie uruchmiały .bat w którym było wywołanie w:\<scieżka>\python
skrypt.py)
i im pojawiały krzaczki. Zalogowałem się na ich komputrze i mi progam dobrze
wywietlał. Czyli domylam jaki problem profilu. Więc 1 pytanie:
PYTANIE 1.
Co powoduje, że powyższy kod uruchamiany na tym samym komputerze, ale u
różnych użytkowników działa dobrze lub le.
PYTANIE 2.
Co powoduje, że w niektórych edytora powyższy kod działa "ładnie", a na
niektórych "nieładnie"
Cišg dalszy tematu.
Czytałem howto unicode (ang), polska ksišżki do pythona na wikibooks
(http://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie/) i kompletnie nie
rozumiałem spraw decode()/encode() przedrostków u"ć" unicode() itd. Dla
mnie to nieczytelne (o dokumentacji Pythona jeszcze napisze w innym pocie).
Robiłem próby tak jak to rozumiałem.
Np w wiikibooks jest zapis:
"
Łańcuch znaków przechowuje znaki w zakodowanej postaci np. w systemie UTF-8,
ISO 8859-1, czy ISO 8859-4; może być wieloznaczny. Natomiast unikod jest
jednoznaczny, więc nie jest zakodowany w tego typu systemach kodowania.
Ponieważ łańcuch znaków jest zakodowany, musimy odkodować (za pomocš
decode), aby otrzymać niezakodowany unikod. Z kolei unikod, ponieważ jest
niezakodowany, musimy zakodować (za pomocš encode), aby otrzymać zakodowany
łańcuch znaków.
"
Dzi wiem jak go interpretować. Ale na poczštku le zrozumiałem.
Sšdziłem, że jak mam unicode to musze go zakodować (cytat: "Z kolei unikod,
ponieważ jest niezakodowany, musimy zakodować").
Oczywicie robišc próby na odbiorcy miałem zero powodzenia. NIC nie
działało. Kompletna porażka.
Jak dzi pojawił problem z tymi znaczkami to powrocie z pracy zaglšdam na
grupę i szukam posty z tematem "unicode", czytam i wycišgam wnioski. Na
poczštek co co niby wiedziałem, ale nie rozumiałem.!!!
*********
Unicode i sposób kodowania plików to 2 RÓŻNE sprawy. Że unicode jest jeden,
natomiast sposobów ZAPISANIA (ang. encodowania) unicodu jest wiele. np
UTF-8, UTF16, itd.
*********
Czyli moje oznaczanie plików UTF-8 NIC NIE ZNACZY! Ze dopóki nie wskaże
Pythonowi, że chcę na wyjciu mieć kod unicode to muszę albo mieć na wejciu
unicod, lub ODCZYTAC/ODSZYFROWAĆ (decode) zapisany teks do kodu unicod.
Czyli, że można stosować konstrukcje:
a) print unicode("Gotówka wysłane",'utf-8') odszyfrowanie do unicode
stringu zaszyfrowanego UTF-8
b) print ("Gotówka wysłane").decode('utf-8') odszyfrowanie do (czego??)
stringu zaszyfrowanego UTF-8
c) print (u"Gotówka wysłane") jawne wskazanie, że
string ródłowy to unicod.
Testuję więc powyższe na programie PyScripter (czyli tam gdzie le
wywietlały polskie znaczki na wyjciu).
Efekt? Pojawiajš się polskie znaczki.
Ale tu pojawiajš schody.
Testuję ten sam kod na PyCharm i SPE 0.8.4.c (czyli tam gdzie wczeniej nie
bawiłem tymi bajerami) i pojawia błšd:
========================
print unicode("Gotówka wysłane",'utf-8') odszyfrowanie do unicode stringu
zaszyfrowanego UTF-8
^
SyntaxError: invalid syntax
Script terminated.
========================
W samym czystym pythonie a) i b) powodujš błšd, jedynie c) działa poprawnie.
PYTANIE 3
Co powoduje, ten niby prawidłowy kod jednak jest nieprawidłowy pod tymi
edytorami? (czyli wraca pytanie 2 - skšd te różnice?)
PYTANIE 4
Czemu musze robić np ("Gotówka wysłane").decode('utf-8') skoro jest nagówek
#-*- coding:utf-8 -*-
Przecież ten nagłówek jawnie wskazuje, że mam 'utf-8' więc po co muszę to
wskazywać w kodzie? czemu sam python tego nie zauważa ?.
Uogólniajšc co robi kontrukcja #-*- coding:utf-8 -*- ?
Gdybym miał strzelać powiedziałby, że dla Pythona nie znaczy NIC, że to
informacja dla EDYTORA.
PYTANIE 5
W którym pocie na grupie pojawia zapis:
sys.setdefaultencoding('utf8')
czyli co o czym wczeniej nie czytałem. i pytanie co robi ten kod?
PS. Może nadal nie rozumiem tego co mylałem że rozumiem. Proszę o odpowied
osoby, które rozumiejš to i potrafiš mi to sensownie wyjasnić.
PS2. Wg mnie istnieje silna potrzeba poprawienia opisu dotyczšcego
unicode/decode/itd w obecnej dokumentacji, która przez skšpš iloć
przykładów jest dla nowych programistów Pythona NIEZROZUMIAŁA. I konieczne
dopisania tam tych niuansów które podniosłem powyżej.
W wikibooks sam spóbuję co poprawić, ale dopiero jak otrzymam odpowie
którš zrozumiem, dzięki czemu będę wiedział co dopiasać.
PS3. Czy kto wie, czemu w wikipedi wcišż brak edytora wizualnego (jak
allegro i innych), tylko trzeba poprawiać kodujšc HTML. Przecież to
ogranicza grono osób, które może co sensownego dopisać, bo znajomoc HTML
jest RZADKA.
Pozdr
PiotrPastuszka
Technical Details
Message-ID:
<hvb8o0$roo$1@node2.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!plix.pl!newsfeed1.plix.pl!wsisiz.edu.pl!newsfeed.atman.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!plix.pl!newsfeed1.plix.pl!wsisiz.edu.pl!newsfeed.atman.pl!not-for-mail From: "Piotr Pastuszka" <piotr.pastuszka@wp.pl> Newsgroups: pl.comp.lang.python Subject: Re: String, unicode, dziwny problem i 5 pytań - długie Date: Wed, 16 Jun 2010 21:30:09 +0200 Organization: ATMAN Lines: 140 Message-ID: <hvb8o0$roo$1@node2.news.atman.pl> NNTP-Posting-Host: 212.180.209.73 Mime-Version: 1.0 X-Trace: node2.news.atman.pl 1276716608 28440 212.180.209.73 (16 Jun 2010 19:30:08 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Wed, 16 Jun 2010 19:30:08 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5931 X-Antivirus: avast! (VPS 100616-1, 2010-06-16), Outbound message X-Antivirus-Status: Clean Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit