Unicode a python

Od paru miesięcy programuję w Pythonie. Najpierw oczywiście trzeba się było Pythona nauczyć, zanim zacząłem w robocie dostawać pierwsze zadania, ale źle nie było. Jedna rzecz mnie w Pythonie zdziwiła, a mianowicie podejście do kodowania stringów. Zresztą, po dziś dzień rozwiązanie tej kwestii w Pythonie sprawia mi niemały kłopot.

Otóż w Pythonie, by ciąg znaków mógł zawierać wszelkie krzaczki i ogonki, musi być unicodowym ciągiem znaków. Zwykłe stringi akceptują tylko i wyłącznie znaki ASCII.

I tak deklarując zmienną w kodzie, na pewno będzie stringiem.

zmienna = 'łańcuch'

Raczej bez różnicy, jakich znaków użyjemy. Jeśli jednak wartość zmienna zostaje wczytana z zewnętrznego źródła danych, wtedy możemy napotkać problem.

Załóżmy teraz, że wczytujemy i przetwarzamy jakiś dokument XML, są one kodowane przeważnie w utf-8. Wartości które będziemy przeważnie przetwarzali zazwyczaj zmieszczą się w spektrum kodowania ASCII i ich konwersja będzie jakby automatyczna, jednak co jakiś czas natrafimy w pobieranych wartościach na polskie ogonki, czeskie ptaszki albo chińskie krzaczki. Wtedy albo program się wywali (na naszym kodzie, np. złączeniu łańcuchów) stwierdzając, że znak w łańcuchu jest spoza zakresu ASCII (lub podobny błąd), albo błąd zwróci wywoływana przez nas funkcja. jakkolwiek wydaje się to zabawne, spora część funkcji nie radzi sobie z Unicode.

Jak to obejść? Wyłapać się wszystkiego w czasie pisania nie da, można chyba tylko przed wywołaniem, które zwraca błąd zastosować poniższą konstrukcję:

if isinstance(zmienna, unicode):
    zmienna = zmienna.encode('utf-8')

Gdy po raz pierwszy spotkałem się z tym problemem, znalazłem informację o możliwości zdefiniowania kodowania plików źródłowych:

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

Ta konstrukcja służy jednak tylko i wyłącznie zdefiniowaniu kodowania kodu źródłowego, nie kodowania używanego przez Pythona. Stąd w swoich pierwszych programach napisanych w pythonie używałem sporo wywołań metody encode i decode na stringu.

Komentarze

Comments powered by Disqus