将Python字节解码为unicode字符串的更好的错误处理方法是什么?

时间:2010-04-08 15:42:41

标签: python unicode

我有一个旧的C#程序,由于不同的原因被移植到Python 3。基本上,程序的作用是获取网站并搜索其内容(并处理它,但这并不是真正相关)。我从未真正遇到过实际的fetch-and-search例程的任何问题,但是一旦我将它移植到Python,就会开始抱怨某些位置的无效unicode。

这不是一个真正的问题,因为实际的源网页数据与旧的C#应用​​程序相同,旧程序通过破坏的数据实现了目标。但是,我想要的是Python 3 decode()方法的行为类似于C#中此类情况的内部处理。不幸的是,在阅读Python手册并查看“忽略”和“替换”错误处理方法后,我真的不知道哪个更好地模仿C#行为(我也无法识别)。

要在讨论中添加一些代码,这里是透明处理所有内容的C#代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
response = (HttpWebResponse)request.GetResponse();
reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string html = reader.ReadToEnd();

相应的Python 3代码如下:

req = Request(url)
r = urlopen(req)
data = r.read().decode("utf_8")

但是,我想找出哪些代码最能模仿C#代码的unicode行为:

data = r.read().decode("utf_8", "replace")

data = r.read().decode("utf_8", "ignore")

任何有深入unicode经验的人都可以给我一些关于哪种方法更好的指示? Python手册确实描述了这种行为,但并不是因为我明白我应该使用哪种行为......

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8.aspx,C#的默认UTF-8解码器会忽略无效字节。

用于解码unicode的Python'ignore'选项与此相同。