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