[python] printy v češtině na WINDOWS/cmd konzoli nečitelné
Petr Přikryl
prikryl na atlas.cz
Úterý Duben 27 22:06:41 CEST 2010
Ano. Bajty posílané na cmd se v českých Windows interpretují jako znaky
v kódování cp852. To je rodné kódování původně DOSového okna.
Hynek Fabian
>petrofF
>> V PyDev/Eclipse je zobrazení (Pydev Console) v pořádku:
>> - v editoru nastavené kódování cp1250
>> - uvozeno: # -*- coding: cp1250 -*-
Je to tím, že se nepoužívá konzolové okno, ale klasické GUI okno,
ve kterém se bajty interpretují jako znaky v cp1250.
>> Tentýž script.py je v konzoli (Python 2.5 / Windows XP / cmd: default
>> CP=1250) zobrazen chybně:
>> Např.:
>> [0x82] é se zobrazí jako Ú
>To bude mít možná nějakou souvislost s tím, že dlouhé e není 0x82 ale 0xE9 :-)
>
>konstrukce #-*- coding: cp1250 -*- má vliv pouze na řetezcové literály v kódu,
>jestli čteš data odjinud, musíš si je dekódovat sám.
>Totéž se týká výstupu, příkaz print respektuje nastavení prostředí, metoda
>write() prostě bleje bajty a překódování je zase na tobě.
>V *nixu je prostředí řízeno LC_ALL, jak to řeší wydle netuším. Ale mám
>nepříjemný pocit že cmd.exe simuluje v českých wydlích dosovskou cp852.
Pořádně to řeší až Python 3, ale dá se to pořádně řešit i v Python 2. Musí se ale
systematicky používat Unicode řetězce. Ty umí správně zobrazit jak cmd okno,
tak GUI okno.
Řetězce ve smyslu "posloupnosti abstraktních znaků' jsou v Pythonu 2
jen Unicode řetězce. Ostatní řetězce jsou jen posloupnostmi bajtů,
které nenesou informaci o svém kódování.
Zkus takovýhle skriptík
==================================================
# -*- coding: cp1250 -*-
b = 'příšerně žluťoučký kůň úpěl ďábelské ódy'
s = u'příšerně žluťoučký kůň úpěl ďábelské ódy'
print b
print s
==================================================
V GUI okně budou oba řádky správně. V cmd okně bude správně
jen ten druhý. V proměnné b je totiž posloupnost bajtů, které
lze správně interpretovat jen při použití stejného kódování, jaké
se používalo v editoru. V proměnné s je skutečný řetězec, který
lze jednoznačně interpretovat kdekoliv.
P.
Další informace o konferenci Python