【问题标题】:UTF-8 string as key in dictionary causes KeyErrorUTF-8 字符串作为字典中的键会导致 KeyError
【发布时间】:2016-08-05 01:34:07
【问题描述】:

我有一本以 unicode 字符串作为键的字典。当我尝试访问该值时,我得到键错误,即使字典中键的打印输出和我的键相等:

>>> test = "Byggår"
>>> key = raw_dict.keys()[7]
>>> print(test)
Byggår
>>> print(key)
Byggår
>>> test
'Bygg\xc3\xa5r'
>>> key
u'Bygg\xe5r'
>>> raw_dict[test]
Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd_exec.py", line 3, in Exec
  File "<input>", line 1, in <module>
KeyError: 'Bygg\xc3\xa5r'

似乎它们的编码方式有所不同。从实验来看,字典中的键似乎被编码为八进制字节(?)http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc3+xa5&mode=obytes,而我尝试访问该值的键被编码为十六进制(?)http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xe5&mode=hex

字典中的键是从网络源获取的,所以我猜在路上有些东西搞砸了。

【问题讨论】:

  • 您使用的是 Python 2,对吧?
  • @zmbq:是的,对不起。应该这么说。
  • 八进制?那个是从哪里来的?哦,等等,您的参考站点具有误导性(通过遗漏)。 0xE5Windows Latin1 编码 (msdn.microsoft.com/en-us/library/cc195054.aspx) 的 a-ring 代码。

标签: python dictionary unicode utf-8 python-unicode


【解决方案1】:

您的test 是一个字符串,而key 是一个unicode 字符串。看到前面的u了吗?

您应该使用 Python 3,其中所有字符串都是 unicode 字符串,或者确保在字典中查找之前将 test 转换为 unicode。

【讨论】:

  • 谢谢,这当然是问题所在。现在觉得有点傻。我以前遇到过其他与网络相关的编码问题,所以我只是专注于错误的事情而完全忽略了这一点。不幸的是,我的平台不支持 Python 3……再次感谢!
  • 非 Unicode 字符串是一只母狗。您必须一直担心编码和解码。
猜你喜欢
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多