簡體   English   中英

處理 Python unicode 字符串中錯誤編碼的字符

[英]Handle wrongly encoded character in Python unicode string

我正在處理由 python-lastfm 庫返回的 unicode 字符串。

我假設在途中的某個地方,庫的編碼錯誤並返回一個可能包含無效字符的 unicode 字符串。

例如,我在變量 a 中期望的原始字符串是“Glück”

>>> a
u'Gl\xfcck'
>>> print a
Traceback (most recent call last):
  File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)

\\xfc 是轉義值 252,對應於“ü”的 latin1 編碼。 不知何故,這以 Python 無法自行處理的方式嵌入到 unicode 字符串中。

我如何將其轉換回包含原始“Glück”的普通或 unicode 字符串? 我嘗試使用解碼/編碼方法,但要么得到了 UnicodeEncodeError,要么得到了包含序列 \\xfc 的字符串。

您必須使用某種編碼(例如 utf-8)將您的 unicode 字符串轉換為標准字符串:

some_unicode_string.encode('utf-8')

除此之外:這是一個騙局

具有類屬性的 BeautifulSoup findall-unicode 編碼錯誤

以及至少十個關於 SO 的其他相關問題。 先研究一下。

你的 unicode 字符串很好:

>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'

您在交互式提示中看到的問題是解釋器不知道使用什么編碼將字符串輸出到您的終端,因此它退回到“ascii”編解碼器——但該編解碼器只知道如何處理 ASCII人物。 它在我的機器上運行良好(因為 sys.stdout.encoding 對我來說是“UTF-8”——可能是因為我的環境變量設置與你的不同)

>>> print u'Gl\xfcck'
Glück

在代碼的開頭,就在導入之后,添加這 3 行。

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')

它將在您的程序過程中覆蓋系統默認編碼 (ascii)。

編輯:除非您確定后果,否則您不應該這樣做,請參閱下面的評論。 這篇文章也很有幫助: sys.setdefaultencoding('utf-8') 的危險

不要將str() 轉換為您從模型字段中獲得的字符串,只要它已經是一個 unicode 字符串。 (哎呀,我完全錯過了它與 django 無關)

我自己在處理一個包含德語單詞的文件時偶然發現了這個錯誤,我不知道它是用 UTF-8 編碼的。 當我開始處理單詞時,問題就出現了,其中一些單詞不會顯示解碼錯誤。

# python
Python 2.7.12 (default, Aug 22 2019, 16:36:40) 
>>> utf8_word = u"Gl\xfcck"
>>> print("Word read was: {}".format(utf8_word))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)

我解決了在字符串上調用 encode 方法的錯誤:

>>> print("Word read was: {}".format(utf8_word.encode('utf-8')))
Word read was: Glück

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM