blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Python i polskie znaki pod Windows

// Sprawdzane w Windows 7

W czasach DOS'u gdy nie było jeszcze Windows a wszystko działo się w trybie tekstowym (tak jak to się dzieje obecnie w konsoli) stosowano różne kodowania polskich liter. Jednym z nich było kodowanie wprowadzone przez Microsoft o nazwie 'CP852', (CP = Code Page = Strona Kodowa) Dlatego też w Windows w oknie konsoli zastosowano to samo kodowanie dla zgodności z DOS'em. Jednocześnie Microsoft wprowadził kodowanie CP1250, które zastosował w nazwach plików.

Powstaje więc problem, że tekst wpisany z klawiatury, który ma polskie znaki w CP852, nie zgadza się z nazwą pliku, która ma polskie znaki w CP1250.

Wystarcza jednak zamiana CP852 na UNICODE a dalej Python już sobie sam poradzi z CP1250.

nazwa = raw_input("nazwa: ")
nazwa = nazwa.decode('CP852')
print open(nazwa).read()

Konsola jednak może stosować inne kodowanie. Przeważnie jednak Python potrafi określić jakie kodowanie jest stosowane w konsoli i tą informację przechowuje w sys.stdin.encoding

import sys

print sys.stdin.encoding

Można więc to wykorzystać przy zamianie nazwy

import sys

nazwa = raw_input("nazwa: ")
nazwa = nazwa.decode(sys.stdin.encoding)
print open(nazwa).read()

Przy okazji: komenda print wykorzystuje tą informację też podczas wypisywania tekstu.

Oczywiście nie każda konsola musi tą informację udostępniać. Podobnie przy przekierowywaniu danych do pliku Python nie ma informacji o kodowaniu i stara się konwertować UNICODE do ASCII

Można wtedy samemu konwertowac UNICODE do odpowiedniego kodowania ale trzeba samemu już wiedzieć jakie to kodowanie ma być.

print u'ĄĘŚĆ'.encode('CP852')

::::bash
# przekierowanie do pliku
python skrypt.py > wyniki.txt

Dla przekonania się jakie kodowanie jest w konsoli można też wypisać polskie litery w różnych kodowania i zobaczyć które się poprawnie pokażą.

print "--- litera A z ogonkiem ---"
print " \xA1 :ISO-8859-2 / Latin 2"
print " \xA4 :CP852"
print " \xA5 :CP1250 / Windows-1250"
print " \xC4\x84 :UTF-8"

ps. w Linux przeważnie konsola jak i system plików stosuje kodowanie UTF-8 więc nie ma takich problemów z polskimi literami. Wciąż jednak może być problem z polskimi literami gdy dane zostaną przekierowane do pliku.


wikipedia: Kodowanie polskich znaków
Python 2: 7.8.3. Standard Encodings

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury