返回信息流新年快乐~!
外部文件里面我写了一个字典,这个字典里面的key都是中文,我在文件头指定了# -*- coding: utf-8 -*-
我另外写了一个py来Import这个外部文件,同样这个py我也指定了utf8,但是在输出的时候却是\xe7 这样的乱码,于是我检查了sys.stdout.encoding,这个值还是utf8。
所以不明白该如何正确输出中文的key值了,求助各位前辈!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #44583同步于 2014/2/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[问题]python的字典使用中文作为key时乱码的问题
cyxsheep
2014/2/1镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
python 2.7.6
类似吧,不过不是u。求解决思路。
【 在 nuanyangyang 的大作中提到: 】
: 确切地说,是类似u"\uxxxx\uxxxx\uxxxx"这样的吧(注意,包含u和引号,如果是python3就没有u)
:
贴代码,贴具体输出。如果太大了,就简化到最小的能重现问题的尺度。
【 在 cyxsheep 的大作中提到: 】
: python 2.7.6
: 类似吧,不过不是u。求解决思路。
'\x**\x**\x**' 没问题的,你说的u'\u****'是decode('utf-8')后的结果
以上情况针对python2.7+
【 在 nuanyangyang 的大作中提到: 】
: 确切地说,是类似u"\uxxxx\uxxxx\uxxxx"这样的吧(注意,包含u和引号,如果是python3就没有u)
:
Python 2.7.5 (default, Sep 22 2013, 11:00:15)
[GCC 4.8.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = '呵呵'
>>> a
'\xe5\x91\xb5\xe5\x91\xb5'
>>> a.decode('utf-8')
u'\u5475\u5475'
>>> print a
呵呵
明白了,也就是说\x是对的。
但是我这样判断好像出问题,代码如下:
a = {
"中国" = [1,2,3],
"地球" = [2,3,4],
}
b = a.keys()
c = ("中国" in b) #False
请问这是为何?
【 在 angellwings 的大作中提到: 】
: '\x**\x**\x**' 没问题的,你说的u'\u****'是decode('utf-8')后的结果
: 以上情况针对python2.7+
啊,我知道哪里出错了。是我漏了一个地方。
【 在 angellwings 的大作中提到: 】
: Python 2.7.5 (default, Sep 22 2013, 11:00:15)
: [GCC 4.8.0] on linux2
: Type "help", "copyright", "credits" or "license" for more information.
: ...................
首先,数据都是以二进制存储的,而一般将8个二进制作为一组称为一字节。
但是这样的话,一字节只能表示256个字符,对于中文等文字来说是远远不够的,这时候就有称之编码的东西。
编码将不定长的多个字节连起来当做一个文字。例如“我”,用utf8编码就是\xe6\x88\x91,用gbk编码就是\xce\xd2。他们的“含义”是相同的,但是二进制表现形式不一样。
因为很重要,所以再说一遍:编码是二进制层面对文字的表述。
回到这里,由于文件存储是二进制的(即使你用编辑器打开看里面“写着中文”,那不过是编辑器的转换,实际上它还是二进制的,就像\xe6\x88\x91这样),所以当程序读进来的时候(一般来说),它实际上是看到的是“\xe6\x88\x91”而不是“我”。在python2中,str就是一个二进制串,它表示的永远都是“\xe6\x88\x91”,unicode才是表示“我”。如非显式转换,它永远都是二进制的串(即使你输出的时候看到了中文,那不过是终端编码设置正好与输出的二进制相同,做的转换罢了)。
另:
# -*- coding: utf-8 -*- 设定的是源代码的编码,仅当源代码中有中文时有用,和读取文件无关
sys.stdout.encoding 设定的是输出的编码,其实不建议使用,print时尽量不print unicode,而是显示转换成二进制后输出