我永远不会知道python2.7的解码和编码系统

时间:2015-05-26 13:51:05

标签: python encoding utf-8

很抱歉问问傻瓜,但也许有人可以帮我摆脱python2.7的解码/编码地狱

我有一个字符串如下,我不确定,但我认为它编码为UTF-8,因为我在py文件的头部写了# -*- coding: utf-8 -*-

s = "今日もしないとね"

并且作为我的观点,如果它是一个字符串,其中一部分可以通过使用[]来打印出来:

print s[1]

然后我的崇高中出现了错误:

[Decode error - output not utf-8]

我在终端尝试过了

?

好吧,也许utf-8字符串的一部分不会变成utf-8字符串,所以我试过了:

print s[1].encode("utf-8")

然后我得到了这个:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xbb in position 0: ordinal not in range(128)

我完全糊涂了。这是否意味着字符串的一部分是像\xbb那样的ascii?

有人能告诉我以下内容的编码是什么吗?

a = "今日もしないとね"
b = u"今日もしないとね"
c = "python2.7 fxxked me"
d = u"python2.7 fxxked me"
e = "今"
f = "z"
aa = a[0]
bb = b[0]
cc = c[0]
dd = d[0]

以及如何从"今日"获取"今日,もしないとね"

谢谢!

2 个答案:

答案 0 :(得分:0)

您的文件已在UTF-8中正确编码,但您的操作系统(直接)不支持输出上的Unicode。

在Python 2中指定Unicode字符串文字的正确方法是使用" u"字首。只有在这种情况下,Unicode字符串实际存储在那里。

顺便说一句,您可以使用repr函数查看Python实际上认为关于您的变量内容的内容:

>>> print a
'\xe4\xbb\x8a\xe6\x97\xa5\xe3\x82\x82\xe3\x81\x97\xe3\x81\xaa\xe3\x81\x84\xe3\x81\xa8\xe3\x81\xad'
>>> print b
u'\u4eca\u65e5\u3082\u3057\u306a\u3044\u3068\u306d'

答案 1 :(得分:0)

正如评论所暗示的那样 - unicode不容易发现 - 学习Python的许多其他部分

以下代码示例将打印"今日"

# -*- coding: utf-8 -*-
b = u"今日もしないとね"
print b[:2]

但是 - 编码行只告诉 Python 如何解释文件中的那些字节。许多编辑都不会寻找编码线,在确定如何向您显示这些字节时,您需要确保他们实际上也使用utf-8。

当Python到达print语句时,它将使用b获取unicode对象sys.stdout.encoding编码。现在这更好地匹配您的终端/控制台设置,或者您将获得一些垃圾打印。