Wiki
Clone wikicomp-house.repo / python-unicode-error
Периодически наблюдаю. в самых разных программах, написанных на питоне исключение UnicodeDecodeError:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)
Все бы ничего, но на питоне написано куча системных утилит, вылетают они в самых неожиданных местах и в итоге эта проблема становится весьма серьезной. Только что вот hplip отказался грузить фирмварь в hp lj 1018 все по той же примитивной причине.
Лечить все программы на предмет укзания кодировки в юникоде и try catch на возможные исключения явно нереально, но поправить ситуацию все же можно. Для этого надо назначить питону дефолтной кодировкой для строк православный utf-8 вместо исчадия САСШП - ascii.
Делается оное путем правки файла /usr/lib(64)/pythonx.y/site.py
Вот пример для FC16-x86_64
Файл /usr/lib64/python2.7/site.py
encoding = "ascii" # Default value set by _PyUnicode_Init()
надо исправить на:
encoding = "utf8" # Default value set by _PyUnicode_Init()
После чего кусочек файла, отвечающий за выбор кодировки строк будет выглядеть следующим образом:
def setencoding(): """Set the string encoding used by the Unicode implementation. The default is 'ascii', but if you're willing to experiment, you can change this.""" encoding = "utf8" # Default value set by _PyUnicode_Init() if 0: # Enable to support locale aware default string encodings. import locale loc = locale.getdefaultlocale() if loc[1]: encoding = loc[1] if 0: # Enable to switch off string to Unicode coercion and implicit # Unicode to string conversion. encoding = "undefined" if encoding != "ascii": # On Non-Unicode builds this will raise an AttributeError... sys.setdefaultencoding(encoding) # Needs Python Unicode build !
Люди, знакомые с программированием заметят, что вместо грубого указания utf-8 вполне можно поправить один из вечно фальшивых if 0 на if вечно истинный, чтобы кодировка строк ставилась в системную, но это уже гурманство.
Updated