Юникод (codecs.BOM_UTF8, "utf8") необходим в Python 2.7 / 3? - PullRequest
6 голосов
/ 11 ноября 2011

В обзоре кода я наткнулся на следующий код:

# Python bug that renders the unicode identifier (0xEF 0xBB 0xBF)
# as a character.
# If untreated, it can prevent the page from validating or rendering 
# properly. 
bom = unicode( codecs.BOM_UTF8, "utf8" )
r = r.replace(bom, '')

Это функция, которая передает строку в объект ответа (Django или Flask).

Это все ещеошибка, требующая исправления в Python 2.7 или 3?Что-то говорит мне, что это не так, но я решил спросить, потому что я не очень хорошо знаю эту проблему.

Я не уверен, откуда это взялось, но я видел это вокругИнтернет, на который иногда ссылаются в связи с Jinja2 (который мы используем).

Спасибо за чтение.

Ответы [ 2 ]

7 голосов
/ 11 ноября 2011

Стандарт Unicode гласит , что символ \ufeff имеет два разных значения. При начале потока данных его следует использовать как порядок следования байтов и / или кодирования, но в других местах его следует интерпретировать как неразрывный пробел нулевой ширины .

Итак, код

bom = unicode(codecs.BOM_UTF8, "utf8" )
r = r.replace(bom, '')

не просто удаляет подпись в кодировке utf-8 (она же спецификация), но и удаляет все встроенные неразрывные пробелы нулевой ширины .

В некоторых более ранних версиях python не было варианта кодека "utf-8", который пропускает спецификацию при чтении потоков данных. Поскольку это было несовместимо с другими другими кодеками Unicode, кодек "utf-8-sig" был введен с версия 2.5 , который пропускает спецификацию.

Так что, возможно, «ошибка Python», упомянутая в комментариях к коду, относится к этому.

Однако более вероятно, что «ошибка» относится к внедренным \ufeff символам. Но поскольку в стандарте Unicode четко указано, что их можно интерпретировать как допустимые символы, потребителю данных необходимо решить, как с ними обращаться, и поэтому не ошибка в python.

0 голосов
/ 11 ноября 2011

BOM - это последовательность байтов, которая указывает, какая кодировка Unicode используется.

Спецификация используется для информирования декодера о том, как преобразовать байты в Unicode (где Unicode может иметь другое двоичное представление).

Нет смысла пытаться поместить спецификацию в строку Unicode.

...