【问题标题】:is unicode( codecs.BOM_UTF8, "utf8" ) necessary in Python 2.7/3?Python 2.7/3 中是否需要 unicode(codecs.BOM_UTF8, "utf8")?
【发布时间】:2011-12-27 02:53:26
【问题描述】:

在一次代码审查中,我遇到了以下代码:

# 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, '')

这是在将字符串传递给 Response 对象(Django 或 Flask)的函数中。

这仍然是一个需要在 Python 2.7 或 3 中修复的错误吗?有些东西告诉我不是,但我想我会问,因为我不太了解这个问题。

我不确定这是从哪里来的,但我在 Internet 上看到过,有时与 Jinja2(我们正在使用)相关联。

感谢阅读。

【问题讨论】:

  • 如果您在代码审查中遇到它,也许您可​​以问作者代码最初来自哪里,是否有一些测试用例?因为我以前从未见过它,并且认为没有真正需要它(至少我从来没有遇到过不这样做的问题)。
  • @poke 很有可能作者就是我。大声笑
  • 现在回复晚了 xD
  • @poke 迟到总比没有好。 :o)

标签: python unicode utf-8 byte-order-mark


【解决方案1】:

BOM 是指定使用何种 Unicode 编码的字节序列。

BOM 用于通知解码器如何将字节转换为 Unicode(其中 Unicode 可以有不同的二进制表示)。

尝试将 BOM 放入 Unicode 字符串中没有任何意义。

【讨论】:

  • OP贴的代码删除字节序标记,不放
【解决方案2】:

Unicode standard states 表示字符\ufeff 有两个不同的含义。在数据流的开始,它应该被用作字节顺序和/或编码签名,但在其他地方它应该被解释为零宽度不间断空间 em>。

所以代码

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

不只是删除 utf-8 编码签名(又名 BOM) - 它还删除任何嵌入的零宽度不间断空格。

一些早期版本的 python 没有“utf-8”编解码器的变体,它在读取数据流时会跳过 BOM。由于这与其他 unicode 编解码器不一致,因此引入了带有 version 2.5 的“utf-8-sig”编解码器,它确实跳过了 BOM。

所以代码cmets中提到的“Python bug”可能与此有关。

但是,“错误”似乎更可能与 嵌入 \ufeff 字符有关。但是由于 Unicode 标准明确规定它们可以被解释为合法字符,因此实际上由数据消费者决定如何处理它们 - 因此 不是 python 中的错误。

【讨论】:

  • 在 Unicode 3.2 中,这种用作零宽度不间断空格的用法已被弃用,取而代之的是“Word Joiner”字符 U+2060。这允许 U+FEFF 仅用作物料清单。 【文件中间的U+FEFF怎么办?】-unicode.org/faq/utf_bom.html#BOM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2019-04-21
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多