🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27520

String, unicode, dziwny problem i 5 pytań - długie

#27520
From: Piotr Pastuszka
Date: Wed, 16 Jun 2010 19:12
138 lines
7360 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 wyświetlają z polskimi znaczkami. To samo, gdy uruchomię 
bezpośrednio z cmd.exe i przekierowuje wynik do pliku. Zawartośc tego pliku 
notatnik wyświetlał mi poprawnie z polskimi znaczkami.

Niestety inne edytory (NetBeans, PyScripter, WingIDE, starsze wersje SPE), 
taki po  uruchomieniu wyświetlał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 
wyświetlał. Czyli domyślam 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 poście). 
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ć").
Oczywiście 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 wyjściu mieć kod unicode to muszę albo mieć na wejściu 
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 
wyświetlały polskie znaczki na wyjściu).
Efekt? Pojawiają się polskie znaczki.
Ale tu pojawiają schody.
Testuję ten sam kod na PyCharm i SPE 0.8.4.c (czyli tam gdzie wcześniej 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ś poście na grupie pojawia zapis:
sys.setdefaultencoding('utf8')
czyli coś o czym wcześniej nie czytałem. i pytanie co robi ten kod?


PS. Może nadal nie rozumiem tego co myślał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 znajomośc HTML 
jest RZADKA.

Pozdr
PiotrPastuszka 
Technical Details
Message-ID: <hvb7nl$ref$1@node2.news.atman.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.atman.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.atman.pl!not-for-mail
From: "Piotr Pastuszka" <piotr.pastuszka@wp.pl>
Newsgroups: pl.comp.lang.python
Subject: String, unicode, dziwny problem i 5 pytań -
 długie
Date: Wed, 16 Jun 2010 21:12:54 +0200
Organization: ATMAN
Lines: 140
Message-ID: <hvb7nl$ref$1@node2.news.atman.pl>
NNTP-Posting-Host: 212.180.209.73
X-Trace: node2.news.atman.pl 1276715573 28111 212.180.209.73 (16 Jun 2010 19:12:53 GMT)
X-Complaints-To: usenet@atman.pl
NNTP-Posting-Date: Wed, 16 Jun 2010 19:12:53 +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-RFC2646: Format=Flowed; Original
X-Antivirus: avast! (VPS 100616-1, 2010-06-16), Outbound message
X-Antivirus-Status: Clean
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit