Я просто подумал, что упомяну здесь кое-что, с чем мне пришлось долго экспериментировать, прежде чем я наконец понял, что происходит. Это может быть настолько очевидным для всех здесь, что они не потрудились упомянуть об этом. Но это помогло бы мне, если бы они имели, так по этому принципу ...!
Примечание: я использую Jython , в частности, v 2.7, поэтому, возможно, это может не относиться к CPython ...
NB2: первые две строки моего файла .py здесь:
# -*- coding: utf-8 -*-
from __future__ import print_function
Механизм построения строки "%" (AKA "оператор интерполяции") также вызывает ДОПОЛНИТЕЛЬНЫЕ проблемы ... Если кодировка "среды" по умолчанию - ASCII, и вы пытаетесь сделать что-то вроде
print( "bonjour, %s" % "fréd" ) # Call this "print A"
У вас не будет проблем с запуском в Eclipse ... В Windows CLI (окно DOS) вы обнаружите, что кодировка - кодовая страница 850 (моя ОС Windows 7) или что-то подобное, что может по крайней мере, обрабатывайте символы с европейским акцентом, так что это сработает.
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
тоже будет работать.
Если, OTOH, вы перенаправляете файл из CLI, кодировкой stdout будет None, которая по умолчанию будет ASCII (в любом случае в моей ОС), которая не сможет обрабатывать ни один из перечисленных выше отпечатков ... (страшная ошибка кодирования).
Итак, вы можете подумать о перенаправлении стандартного вывода с помощью
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
и попробуйте запустить в CLI трубопровод к файлу ... Как ни странно, печать A выше будет работать ... Но печать B выше вызовет ошибку кодирования! Следующее, однако, будет работать нормально:
print( u"bonjour, " + "fréd" ) # Call this "print C"
Вывод, к которому я пришел (условно), заключается в том, что если строка, указанная как строка Unicode с использованием префикса "u", передается в механизм% -обработки, она, по-видимому, включает использовать кодировку среды по умолчанию, независимо от того, настроили ли вы stdout для перенаправления!
Как люди справляются с этим - вопрос выбора. Я хотел бы, чтобы эксперт по Unicode сказал, почему это происходит, правильно ли я понял это, каким является предпочтительное решение, относится ли это также к CPython , происходит ли это в Python 3, и т. д.