Search on blog:

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

If you like it
Buy a Coffee