在一次代码审查中,我发现了以下代码:
# 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/