python - python 2.7/3 中是否需要 unicode(codecs.BOM_UTF8, "utf8")?

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

在一次代码审查中,我发现了以下代码:

# 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 中修复的错误吗?有些东西告诉我它不是,但我想我会问,因为我不太了解这个问题。

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

感谢阅读。

最佳答案

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

所以代码

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。

所以代码注释中提到的“Python 错误”可能与此有关。

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

关于python - python 2.7/3 中是否需要 unicode(codecs.BOM_UTF8, "utf8")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8096078/

相关文章:

Python Popen 无法在 Windows PowerShell 中使用正确的编码

Python UnicodeDecodeError : 'utf8' codec can't decode byte. ..意外的代码字节

python - 通过中介模型在 django 中创建与 AUTH_USER_MODEL 的多对多关系

java - 对于字符类型,方法 isDefined(char) 未定义

Python:在for循环中写入CSV,有条件地在特定列中添加值

python-2.7 - 比较 unicode 和非 unicode 字符串(西类牙语)

python - python etree.tostring 的编码问题

php 错误描述 : Incorrect string value: '\xF4t l'\xE9. ..' 插入

python - 使用 Python 在 Redis 中增加哈希字段的值

python - 如何让 Python 2.7 和 Python 3.1 在 Windows 7 上共存?