【问题标题】:How does source encoding apply within string literals?源编码如何在字符串文字中应用?
【发布时间】:2016-10-04 08:05:30
【问题描述】:

PEP-263 指定源中指定的编码按以下顺序应用:

  1. 读取文件

  2. 假设每个文件的编码固定,将其解码为 Unicode

  3. 将其转换为 UTF-8 字节字符串

  4. 标记 UTF-8 内容

  5. 编译它,从给定的 Unicode 数据创建 Unicode 对象 并从 Unicode 文字数据创建字符串对象 首先将 UTF-8 数据重新编码为 8 位字符串数据 使用给定的文件编码

所以,如果我采用以下代码:

print 'abcdefgh'
print u'abcdefgh'

并将其转换为 ROT-13:

# coding: rot13

cevag 'nopqrstu'
cevag h'nopqrstu'

我希望它首先被解码,然后变得与原始相同,打印:

abcdefgh
abcdefgh

但是,它会打印:

nopqrstu
abcdefgh

因此,unicode 文字按预期工作,但 str 仍未转换。 为什么?


排除一些可能性:

我确认问题不在后期阶段(打印到控制台),而是在解析时立即出现,因为此代码产生 "ValueError: unsupported format character 'q' (0x71) at index 1" em>:

x = '%q' % 1  # that is %d !

【问题讨论】:

    标签: python python-2.7 character-encoding


    【解决方案1】:

    我猜最后一点实际上非常准确地解释了发生的事情:

    1. 编译它,从给定的 Unicode 数据创建 Unicode 对象并 首先从 Unicode 文字数据创建字符串对象 使用给定文件将 UTF-8 数据重新编码为 8 位字符串数据 编码

    经过前 4 步后,源文件的内容是以下字符串的标记化 unicode 版本:

    print 'abcdefgh'
    print u'abcdefgh'
    

    之后,在第5步,字符串对象'abcdefgh'使用给定的文件编码(即rot13)重新编码为8位字符串数据,所以内容变为:

    print 'nopqrstu'
    print u'abcdefgh'
    

    【讨论】:

    • 您是否在 2 年后回答,因为我今天刚刚将您的问题添加到我的收藏夹中?几个小时前我正在考虑它并在我的终端上进行测试,然后boum!一个答案。还是非常感谢。我最初来到这里是因为我试图理解第 5 步的含义。
    • @Maggyero 是的,我收到了关于这个问题的通知,并决定我知道答案:D
    • 所以总结一下(如果我错了,请纠正我):tokenizer 只接受 UTF-8 字符串作为输入。所以需要将源代码转码为UTF-8,即从声明的源代码编码中解码,编码为UTF-8。然而,源代码中的 byte string literals 也会在这个过程中被解码,尽管它们不应该被解码(但在这个阶段我们还不知道它们的类),因为它们是文本的。这就是为什么在第 5 步它们被重新编码为声明的源代码编码。顺便说一句,最后一点还不清楚,tokenizer 的输出是什么:Unicode 还是 UTF-8 字符串?
    猜你喜欢
    • 2019-07-14
    • 2012-08-26
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多