2016-01-09 25 views
0

我试图从网站中获取带有特殊字符的文本,并且Python返回的字符串因此充满了“\ x”字符。 但是,似乎编码是错误的。 例如,读取时:Python获取UTF-8字符的错误编码?

根据
th =urllib2.urlopen('http://norse.ulver.com/dct/zoega/th.html') 

在网页中应包含字母“TH”,其中有字节数C39E和Unicode代码DE的<h1>水平线上http://www.fileformat.info/info/charset/UTF-8/list.htm

相反,我得到

'<h1>\xc3\x9e</h1>' 

在两个字节数分裂,使写入行到一个文件时,然后用Unicode编码打开它,我得到“AZ”,而不是“TH”。

如何强制Python对\uC39E\xde而不是\xc3\x9e这样的字符进行编码?

+0

声音就像一切正在工作,但它会混淆。别担心,这是相当普遍的。不要使用拉丁语-1或代码页1251工具来检查UTF-8(或者直接前往;但了解您正在查看的内容)。 – tripleee

+0

术语更正:0xC3 0x9E是[U + 00DE](http://www.fileformat.info/info/unicode/char/00de/index.htm)的UTF-8 *编码*。 – tripleee

回答

0

这是正确的UTF-8 字节编码U + 00DE的,它需要两个字节来表示它(\xc3\x9e),但您需要将其解码为Unicode看到的Unicode码点:

>>> '<h1>\xc3\x9e</h1>'.decode('utf8') 
u'<h1>\xde</h1>' 

以上是显示正确Unicode码位的Unicode字符串。在UTF-8控制台上打印:

>>> print '<h1>\xc3\x9e</h1>'.decode('utf8') 
<h1>Þ</h1> 

如果使用错误的编码进行解码,将得到不同的Unicode码点。在这种情况下,U + 00C3和U + 017E。 \xc3是Unicode字符串的转义码为Unicode代码点< U + 0100而\u017E是一个用于码点< U + 10000:

>>> '<h1>\xc3\x9e</h1>'.decode('cp1252') 
u'<h1>\xc3\u017e</h1>' 
>>> print '<h1>\xc3\x9e</h1>'.decode('cp1252') 
<h1>Þ</h1> 

推荐阅读: