尝试解码无效的编码utf-8 html页面会在python,firefox和chrome中产生不同的结果.
测试页面中的无效编码片段如下所示 'PREFIX\xe3\xabSUFFIX'
>>> fragment = 'PREFIX\xe3\xabSUFFIX'
>>> fragment.decode('utf-8', 'strict')
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 6-8: invalid data
Run Code Online (Sandbox Code Playgroud)
更新:这个问题在Python unicode组件的bug报告中得出结论.据报道,该问题在Python 2.7.11和3.5.2中得到修复.
以下是用于处理Python,Firefox和Chrome中的解码错误的替换策略.注意它们是如何不同的,特别是python内置如何删除有效S(加上无效的字节序列).
内置replace错误处理程序用U + FFFD 替换无效\xe3\xab加上
SfromSUFFIX
>>> fragment.decode('utf-8', 'replace')
u'PREFIX\ufffdUFFIX'
>>> print _
PREFIX?UFFIX
Run Code Online (Sandbox Code Playgroud)
要测试浏览器如何解码无效的字节序列,将使用cgi脚本:
#!/usr/bin/env python
print """\
Content-Type: text/plain; charset=utf-8
PREFIX\xe3\xabSUFFIX"""
Run Code Online (Sandbox Code Playgroud)
Firefox和Chrome浏览器呈现:
PREFIX?SUFFIX
Run Code Online (Sandbox Code Playgroud)
replace错误处理程序str.decode正在删除SfromSUFFIX(更新1)
根据维基百科UTF-8(感谢mjv),以下字节范围用于指示字节序列的开始
'PREFIX\xe3\abSUFFIX' …