【问题标题】:what if a python unicode object has been decoded incorrectly如果 python unicode 对象被错误解码怎么办
【发布时间】:2014-02-11 13:38:26
【问题描述】:

我有一个 unicode 变量,比如 unicodeVar。例如, u'\xea\xb1\xb8\xec\x8a\xa4\xeb\x8d\xb0\xec\x9d\xb4 \xeb\xaf\xb8\xeb\x8b\x88\xec\x95\xa8\xeb\xb2\x94 3\xec\xa7\x91' .

这就是我在控制台中简单地键入 unicodeVar 时的样子。 事实上,这是걸스데이 미니앨범 3집的表示。是的!这是韩国的。显然,这个变量被错误地解码为 un​​icode。 我从来没有在我的程序中使用 unicodeVar 得到这个。上面显示的是

的结果
'\xea\xb1\xb8\xec\x8a\xa4\xeb\x8d\xb0\xec\x9d\xb4 \xeb\xaf\xb8\xeb\x8b\x88\xec\x95\xa8\xeb\xb2\x94 3\xec\xa7\x91'.decode('utf-8')

如果我这样做:unicodeVar.decode('unicode-escape'),结果是带有双斜杠的字符串。 赞'\\xea\\xb1\\xb8\\xec\\x8a\\xa4\\xeb\\x8d\\xb0\\xec\\x9d\\xb4 \\xeb\\xaf\\xb8\\xeb\\x8b\\x88\\xec\\x95\\xa8\\xeb\\xb2\\x94 3\\xec\\xa7\\x91'

问题是,我怎样才能从可变方式获得正确的表示?这意味着只使用 unicodeVar?

【问题讨论】:

  • 一开始你是怎么把这个值放到变量中的?理想情况下,您应该首先修复程序中获得它的部分,而不是事后尝试重新编码... :)
  • 它是函数的返回值,在 pyquery 模块中。该函数似乎没有任何问题:就像 PyQuery(#title).html()
  • @prehawk,#title 来自哪里?似乎获取网页内容的库没有正确处理编码(字符集),或者网页本身缺少编码信息。
  • @falsetru 是的!这是一个库名 pyquery。网页以 utf-8 编码。

标签: python string unicode character-encoding


【解决方案1】:

使用latin1 编码对字符串进行编码以获得完整的字节。然后使用正确的编码对其进行解码(本例为utf-8):

>>> s = u'\xea\xb1\xb8\xec\x8a\xa4\xeb\x8d\xb0\xec\x9d\xb4\xeb\xaf\xb8\xeb\x8b\x88\xec\x95\xa8\xeb\xb2\x94 3\xec\xa7\x91'
>>> print(s.encode('latin1').decode('utf-8'))
걸스데이미니앨범 3집

为什么会这样?

您的程序(或库)的某些部分将 utf-8 编码的字节视为 latin1,使用 latin1 而不是 utf-8 对其进行解码。你最好改变那部分。

>>> utf_8_bytes = u'걸스데이미니앨범 3집'.encode('utf-8')
>>> utf_8_bytes.decode('latin1')
u'\xea\xb1\xb8\xec\x8a\xa4\xeb\x8d\xb0\xec\x9d\xb4\xeb\xaf\xb8\xeb\x8b\x88\xec\x95\xa8\xeb\xb2\x94 3\xec\xa7\x91'

【讨论】:

  • 有效!还有更多的问题,像 u'\xea\xb1' 这样的所有 unicode 是错误解码的结果,你怎么知道它被定义为 latin1 而不是其他编码?
  • @prehawk,没有上下文,我不确定那个 unicode 是什么意思。如果您会阅读韩语,阅读this post 会有所帮助。
  • 所以这不是一种常见的方式,对吧?是否有任何建议通常处理错误解码的 unicode。我不确定我是否会遇到其他中文或日文或其他字符集。
  • @prehawk,如答案中所述,使库以正确的编码解码内容。
  • @prehawk,如果库不能自己获取编码信息,并且它接受某种encoding/charaset参数,则显式传递编码。
【解决方案2】:

如果您的字符串开头没有u,请不要在开头添加u,只需使用utf-8 编码对其进行解码以获得unicode 字符串:

>>> print '\xea\xb1\xb8\xec\x8a\xa4\xeb\x8d\xb0\xec\x9d\xb4 \xeb\xaf\xb8\xeb\x8b\x88\xec\x95\xa8\xeb\xb2\x94 3\xec\xa7\x91'.decode('utf-8')
걸스데이미니앨범 3집

【讨论】:

  • 如果OP有字节串且终端编码为UTF-8,OP不需要解码。
  • 它不是文字字符串,它来自一个变量。对不起,你没有击中它。 :)
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多