python - Python 2.7 中的 Unicode 西里尔字母字符串

标签 python unicode encoding python-2.x cyrillic

我有一段 Python 2.7 代码,它返回以 UTF-8 编码的网页。 它本质上是这样做的:

  arequest=urllib2.urlopen(request.httprequest.host_url[:-1]+record.path)
  response=arequest.read()
  parser = etree.HTMLParser()
  tree   = etree.fromstring(response, parser)

然后我从树中提取标签信息:

imgtags=map(lambda x: {'template_tag':False,'tag_type':'img','page_id':record.id,'src_value':x.attrib.get("src",""),'seo_a_title_text': x.attrib.get("title",""),'seo_text': x.attrib.get("alt","")}, tree.findall(".//img"))

问题在于,生成的代码会返回此内容,其中 seo_a_title_text 等项目是用 \xd0 编码的,而不是我使用的 \u0428 编码的。需要:

[{'seo_a_title_text': u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'src_value': '/logo.png', 'seo_text': u'Logo of \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'template_tag': False, 'page_id': 150, 'tag_type': 'img'}]

西里尔字符串是“Штаты”,我需要将 \xd0 等转换为 \u0428\u0442\u0430\u0442\u044b 表示数据库保存成功,否则当我再次读取它时,它看起来像“СÑаÑÑ”。

如何使字符串看起来像 \u 等而不是 \x 等?我肯定错过了一些东西,但我已经在网络和控制台上折腾了几个小时,试图让它工作。

附注,文件顶部有此注释:

# -*- coding: utf-8 -*-

不确定这是否会影响答案?

最佳答案

这个\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b字符串是Штаты的utf8表示。

utf8使用一个或多个字节对字符进行编码,因此例如:Ш(在unicode表中的位置为0x0428,将在utf8中编码为\xd0\xa8)。

现在是棘手的部分,您将获得一个 utf8 字符串作为 unicode 字符串。在正确应用 utf8 之前,您需要将其转换为字节。 一个技巧是使用 ISO 8859-1(又名 Latin-1),因为它将前 256 个 Unicode 代码点映射到它们的字节值。

>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'
'ШÑ\x82аÑ\x82Ñ\x8b'
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1')
b'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1').decode('utf8')
'Штаты'

注意:正如 bruno 所说,解析器可以直接配置正确的编码。这将避免这种肮脏的编码困惑......

parser = etree.HTMLParser(encoding='utf8')

关于python - Python 2.7 中的 Unicode 西里尔字母字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960147/

相关文章:

C# StreamReader Encoding.UTF8 不工作

unicode - 任何好的 GB、Big5、Unicode 转换器

eclipse - JUnit 中的编码 : Gradle vs Eclipse

python - 在 Python 中解析 C 结构

python - sympy lambdify 与元组中的函数参数?

python - python 的 print 函数现在处理 unicode 的方式是否与编写 Dive Into Python 时不同?

json - JSONEncoder.encode 在 Swift 中抛出什么异常?

javascript - 在 JavaScript 中编码 Base 64,在 C# 中解码 unicode

python - Pandas - 从包含列表的字典中创建只有一行的数据框

python - xlsxwriter:设置第 0 列宽度时,所有其他列的宽度都会重置