Я просто подумал, что я упомянул кое-что здесь, с которым мне пришлось долго экспериментировать, прежде чем я наконец понял, что происходит. Это может быть настолько очевидным для всех здесь, что они не удосужились упомянуть об этом. Но это помогло бы мне, если бы у них было, поэтому по этому принципу ...!
NB: Я использую 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, то стандартная кодировка будет None, которая по умолчанию будет ASCII (на моей ОС в любом случае), который не сможет обрабатывать ни одну из вышеприведенных распечаток ... (ужасная ошибка кодирования).
Итак, вы можете подумайте о перенаправлении своего stdout с помощью
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
и попробуйте запустить в конвейере CLI файл ... Очень странно, что печать A выше будет работать ... Но печать B выше выкинет ошибку кодирования ! Далее будет выполнено следующее:
print( u"bonjour, " + "fréd" ) # Call this "print C"
Вывод, к которому я пришел (временно), состоит в том, что если строка, указанная как строка Unicode , использующая «u префикс отправлен в механизм% -handling, который, как представляется, предполагает использование кодировки среды по умолчанию, независимо от того, было ли вы настроено перенаправление stdout!
Как люди справляются с этим, это вопрос выбора. Я хотел бы приветствовать эксперта Unicode, чтобы сказать, почему это происходит, независимо от того, было ли у меня это неправильное в некотором роде, какое предпочтительное решение для этого, относится ли оно также к CPython , происходит ли это в Python 3 и т. д. и т. д.