2016-01-09 45 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> 

推薦閱讀: