小编dan*_*gra的帖子

为什么python decode会替换编码字符串中的无效字节?

尝试解码无效的编码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),以下字节范围用于指示字节序列的开始

  • 0xC2-0xDF:2字节序列的开始
  • 0xE0-0xEF:3字节序列的开始
  • 0xF0-0xF4:4字节序列的开始

'PREFIX\xe3\abSUFFIX' …

python security unicode screen-scraping

27
推荐指数
2
解决办法
6161
查看次数

标签 统计

python ×1

screen-scraping ×1

security ×1

unicode ×1