🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
4 messages
4 total messages Started by Piotr Pastuszka Wed, 16 Jun 2010 19:30
Re: String, unicode, dziwny problem i 5 pytań - długie
#27521
Author: Piotr Pastuszka
Date: Wed, 16 Jun 2010 19:30
138 lines
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 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
Re: String, unicode, dziwny problem i 5 pytań - długie
#27522
Author: Gallus Anonimus
Date: Fri, 18 Jun 2010 13:29
34 lines
1855 bytes
On Wed, 16 Jun 2010 21:30:09 +0200, "Piotr Pastuszka"
<piotr.pastuszka@wp.pl> wrote:

>"
>#-*- coding:utf-8 -*-
>print ("Gotówka  wysłane")
>"


Reszty teraz nie przeczytam, ale tak na szybko to tu masz buraka w tym
kodzie. Powinno być tak:

#-*- coding:utf-8 -*-

print  u"Gotówka  wysłane"

Czyli tekst będzie interpretowany jako unikodowy (literka u przed
cudzysłwem)

Tylko że na wyjście będzie wysyłany unicod a wyświetlanie unicodu w
konsoli to na unixie, a w windzie niet. Dlatego może wywalić enkoding
error. Dlatego na windzie robisz tak:

#-*- coding:utf-8 -*-

print  u"Gotówka  wysłane".encode('cp1250')

a wszędzie w kodzie przy tekstach użwyasz u"....", czyli:

a = u"Łączka zajączka"

Możesz też próbować przestawić kodowanie ogólnie dla całego pythona,
ale w to mi się nie chce nigdy bawić, bo to jakaś zamotana sprawa
jest.
Re: String, unicode, dziwny problem i 5 pytań - długie
#27523
Author: Waldek M.
Date: Sun, 20 Jun 2010 18:25
14 lines
1348 bytes
Dnia Fri, 18 Jun 2010 15:29:19 +0200, Gallus Anonimus napisał(a):
> Reszty teraz nie przeczytam, ale tak na szybko to tu masz buraka w tym
> kodzie. Powinno być tak:
> 
> #-*- coding:utf-8 -*-
> 
> print  u"Gotówka  wysłane"
> 
> Czyli tekst będzie interpretowany jako unikodowy (literka u przed
> cudzysłwem)

W nowszych Pytongach unicode jest domyślne, o ile dobrze pamiętam.

Waldek
Re: String, unicode, dziwny problem i 5 pytań - długie
#27524
Author: Jan Kaliszewski
Date: Tue, 22 Jun 2010 21:48
43 lines
2798 bytes
On Sun, 20 Jun 2010 20:25:29 +0200, Waldek M. <wm@localhost.localdomain>  
wrote:

> Dnia Fri, 18 Jun 2010 15:29:19 +0200, Gallus Anonimus napisał(a):
>> Reszty teraz nie przeczytam, ale tak na szybko to tu masz buraka w tym
>> kodzie. Powinno być tak:
>>
>> #-*- coding:utf-8 -*-
>>
>> print  u"Gotówka  wysłane"
>>
>> Czyli tekst będzie interpretowany jako unikodowy (literka u przed
>> cudzysłwem)
>
> W nowszych Pytongach unicode jest domyślne, o ile dobrze pamiętam.

To mocno nieścisłe stwierdzenie. W tym wypadku "w nowszych" == Python 3.x

A domyślne jest w tym sensie, że:

* podstawowy typ napisowy to 'str' -- z tym, że jest to ten typ, który
w Py 2.x nazywał się 'unicode' (tak jak już napisałem w którymś z postów
'str' z Py 2.x zostało usunięte; w jego miejsce pojawia się typ bytes,
który, zasadniczo przeznaczony do danych binarnych a nie tekstowych);
Z tego, że standardowe stringi są unicodowe, wynika w Pythonie 3.x również
to, że nie są już używane literały z 'u' przed cudzysłowem.

* domyślnym kodowaniem źródeł jest utf-8 (a nie ascii, jak w 2.x); co
fajne, nazwy zmiennych (pythonowe identyfikatory) mogą zawierać dowolne
litery unicodowe -- nie tylko łacińskie, a więc zmienna może się nazywać
np. 'żółw' lub 'бабушка'.

* kodowanie domyślne zwracane przez sys.getdefaultencoding() wydaje się
być również ustawione na 'utf-8' a nie 'ascii' jak w Py 2.x; przynajmniej
tak jest u mnie (Debian testing) -- w dokumentacji Pythona nie widzę nic
o tym, czy jest to zawsze 'utf-8'; to ustawienie ma co prawda i tak ma
znacznie mniejsze znaczenie, niż w Py 2.x, bo w Py 3.x nie ma niejawnej
automatycznej konwersji str <-> bytes (kodowanie z
sys.getdefaultencoding() było w Py 2.x stosowane przy niejawnej
automatycznej konwersji unicode <-> str).

pozdr.
*j
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads