关于python unicode的困惑

时间:2013-08-04 10:57:45

标签: python python-2.7 unicode

我在windows7中用sublime文本写了一个python文件,文件中有一些中文字符,所以当我运行它时,字符变得无法识别(cmd和git bash也是如此):

# -*- coding: utf-8 -*- 
str = "测试"

print str

arr = []
arr.append(str)

print arr

结果是:

娴嬭瘯
['\xe6\xb5\x8b\xe8\xaf\x95']

我该如何解决这个问题?这个问题的原因是什么?并且arr打印结果不应该像\uXXX那样是unicode吗?

顺便说一句,没有# -*- coding: utf-8 -*-我甚至无法运行它:

$ python test.py
  File "test.py", line 2
SyntaxError: Non-ASCII character '\xe6' in file test.py on line 2, but no encodi
ng declared; see http://www.python.org/peps/pep-0263.html for details

我只是用Google搜索了这句话,为什么没有它就能运行代码呢?

2 个答案:

答案 0 :(得分:4)

文件中使用的specify the encoding需要

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

您输出['\xe6\xb5\x8b\xe8\xaf\x95']是因为您的字符串是字节字符串而不是unicode字符串,请在字符串中添加u前缀以将其转换为unicode字符串。

>>> strs = u"测试"
>>> lis = [strs]
>>> print lis
[u'\u6d4b\u8bd5']
>>> print lis[0]
测试

答案 1 :(得分:3)

您正在看到字符串的UTF-8编码版本(顺便说一下,您不应将其命名为str)。通过在脚本开头添加# -*- coding: utf-8 -*-行,您告诉Python这是您的脚本使用的编码。你确定它实际上是在使用那种编码吗?

如果不是这种情况(请检查您的编辑器!)或者您的终端窗口(您print字符串的位置)恰好使用不同的编码,您将获得乱码(或错误,如果编码的字符串不能用该编码来解释。)

只有当你解码你的(字节)字符串时,你才会得到一个Unicode对象。

首先,您需要了解终端的字符编码。然后你应该尽快将所有字符串转换为Unicode并且只操作程序中的Unicode对象,直到输出它们为止 - 此时你需要将它们编码为正确的编码。

例如

# -*- coding: utf-8 -*- 
s = u"测试"
s = s + u"娴嬭瘯"
print s.encode("somecodepage")