2017-01-13 15 views
0

Я видел несколько сообщений, связанных с этим, но ясного ответа не было. Предположим, я хочу напечатать строку s=u'\xe9\xe1' в терминале, который поддерживает только ASCII (например, LC_ALL=C; python3). Есть ли способ настроить следующее как поведение по умолчанию:Обработка кодировки по умолчанию Python по умолчанию

import sys 
s = u'\xe9\xe1' 
s = s.encode(sys.stdout.encoding, 'replace').decode(sys.stdout.encoding) 
print(s) 

Т.е., я хочу строку, чтобы напечатать что-то - даже мусор - а не поднимая исключение (UnicodeEncodeError). Я использую python3.5.

Я хотел бы избежать написания этого для всех моих строк, которые могут содержать UTF-8.

ответ

1

Вы можете сделать один из трех вещей:

  • Настройка обработчика ошибок для stdout и stderr с PYTHONIOENCODING environment variable:

    export PYTHONIOENCODING=:replace 
    

    записке :; Я не указал кодек, только обработчик ошибок.

  • Заменить stdoutTextIOWrapper, установив другой обработчик ошибок:

    import sys 
    import io 
    
    sys.stdout = io.TextIOWrapper(
        sys.stdout.buffer, encoding=sys.stdout.encoding, 
        errors='replace', 
        line_buffering=sys.stdout.line_buffering) 
    
  • Создать отдельный TextIOWrapper экземпляр вокруг sys.stdout.buffer и передать в качестве file аргумента при печати:

    import sys 
    import io 
    
    replacing_stdout = io.TextIOWrapper(
        sys.stdout.buffer, encoding=sys.stdout.encoding, 
        errors='replace', 
        line_buffering=sys.stdout.line_buffering) 
    
    print(s, file=replacing_stdout) 
    
+0

Это именно то, что я искал - очень ценю! (Я пошел с вариантом 2) – ws6079