[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