Wiki

Clone wiki

comp-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