Občas se mi stane, že spouštím v Linuxu Python skript vytvořený ve Windows. Nejčastěji je to nějaká studentská práce, domácí úkol nebo něco podobného. Většinou není co řešit a program si prostě spustím, ale občas dělá problém diakritika v unicode řetězcích. Třeba:
1 2 3 4 5 | |
Python se snaží v těchto situacích unicode řetězec konvertovat do příslušné znakové sady. Problém je, že neví, která znaková sada je ta “příslušná” a proto končí s chybovým hlášením:
1 2 3 4 5 | |
Nejdřív to, co problémy nedělá: S tímto kódem problémy nejsou, protože kódování
pro standardní vstup/výstup je nastaveno na UTF-8.
1 2 3 4 5 6 7 8 9 10 | |
Pokud je třeba nějak měnit kódování standardního vstupu/výstupu je to možné
udělat jednoduše přes proměnnou prostředí PYTHONIOENCODING. Výstup potom
vypadá takto:
1 2 3 4 5 6 | |
Default encoding zůstalo stejné, změnilo se jen kódování standardního
vstupu/výstupu. Jak tedy nastavit defaultencoding?. To se totiž projeví u
otevřených souborů nebo například u vestavěné funkce raw_input().
Nejjednodušší je použít funkci sys.setdefaultencoding(). Má to ale jeden malý
háček. Takto funkce je dostupná pouze při spuštění Pythonu. Dále se setkáme s
chybovým hlášením.
1 2 3 4 | |
První fígl je použít funkci reload():
1 2 3 | |
nebo
1 | |
Druhý fígl je spustit Python s parametrem -S. Ten zakáže automatický import
modulu site, který výchozí znakovou sadu nastavuje a funkci
setdefaultencoding poté znepřístupní.
1 2 3 4 5 | |
Výše jsem uvedl řešení pro jeden konkrétní zdrojový kód. Pokud požadujeme
globální nastavení stačí vytvořit soubor sitecustomize.py a umístit ho
někam do PYTHONPATH respektive do sys.path.
1 2 | |
- Odkazy:
- http://stackoverflow.com/questions/11741574/how-to-set-the-default-encoding-to-utf-8-in-python
- http://stackoverflow.com/questions/2276200/changing-default-encoding-of-python
- http://stackoverflow.com/questions/7105441/how-to-set-default-encoding-in-python-setdefaultencoding-function-does-not-ex