Python chr和编码问题的问题

Python chr和编码问题的问题,python,python-3.x,character-encoding,Python,Python 3.x,Character Encoding,我想知道为什么以下代码的输出正在更改: N = 128 print(chr(N)) file = open('output.txt', 'w') file.write(chr(N)) file.close() 在output.txt中,输出为:(Python使用UTF-8进行编码。functinchr为每个输入值返回相应的字符。但是,并非所有字符都可以显示;有些字符仅用于控制目的。在您的示例中,128是填充字符。由于无法显示,因此每个环境对它的处理都不同。因此,您的文件编辑器以十六进制显示

我想知道为什么以下代码的输出正在更改:

N = 128

print(chr(N))

file = open('output.txt', 'w')
file.write(chr(N))
file.close()

在output.txt中,输出为:(Python使用UTF-8进行编码。functin
chr
为每个输入值返回相应的字符。但是,并非所有字符都可以显示;有些字符仅用于控制目的。在您的示例中,128是填充字符。由于无法显示,因此每个环境对它的处理都不同。因此,您的文件编辑器以十六进制显示它的值,而您的IDE只是不显示它。然而,编辑器和IDE都知道它是什么字符。

Python使用UTF-8进行编码。functin
chr
返回每个输入值的对应字符。但是,并非所有字符都可以显示;有些字符仅用于控制目的。在在我们的例子中,128是填充字符。由于它不能显示,每个环境对它的处理都不同。因此,您的文件编辑器以十六进制显示其值,而您的IDE根本不显示它。然而,编辑器和IDE都知道它是什么字符。

您的代码、文件或其他任何东西都没有问题

您正确地将
chr(128)
,aka,aka作为UTF-8写入Unicode控制字符。该文件将具有该字符的UTF-8编码(两个字节
\xc2\x80

当您在未指定的第一个程序中查看它时(可能您只是将它设置为任何终端?),它正确地将这两个字节读取为字符U+0800的UTF-8,并显示其所选字体具有的该字符的任何图像

当您在PyCharm中查看它时,它也正确地读取U+0800并使用所选字体显示它

唯一的区别是它们使用不同的字体。不同的字体对不可打印的控制字符有不同的作用。(此字符没有标准的呈现方式。它在Unicode中没有特定的含义,但映射到拉丁语-1补充字符
0x80
,定义为控制字符“PAD”,是“Padding Character”的缩写。1)不同的东西可能有用,所以不同的字体可以做不同的事情:

  • 向您显示控制字符的十六进制值可能对在shell中使用Unicode的人很有用,因此您的终端(或其他任何终端)被配置为使用一种字体向他们指明方向
  • 通过使用通用替换box2向您显示这可能是您不想打印的内容也是合理的,因此PyCharm配置了一种字体来实现这一点
  • 仅将其显示为一个空格也是合理的,尤其是在固定宽度的字体中。这是我在终端上从Python REPL获得的
    cat
    it或
    print
    it
  • 在框中显示控制字符(
    PAD
    )的传统拉丁-1名称也很有用。这就是
    Unifont
    的功能
  • 如果您正在处理一堆旧的Java或Win32代码,出于向后兼容性的原因,将其显示为欧元符号可能会很有用。3

1.从技术上讲,这已不再完全正确;Unicode根据ISO-15924代码998“Zyyy:不确定脚本的代码”对其进行了定义,根本不作为ISO-8859的一部分。但实际上,它要么是
PAD
,要么是一个不确定的无意义字符,这并没有多大用处

2.您实际粘贴到问题中的内容既不是
U+0080
也不是
U+FFFD
,而是
U+25A1
,也称为“白色正方形”。大概是PyCharm认识到它的字体没有
U+0080
字形,并手动替换了
U+25A1
,或者从剪贴板到浏览器的堆栈溢出链上的某个东西也做了同样的事情


3.创建欧元符号后,但在Unicode 2.1添加U+20AC和ISO-8859添加拉丁-9编码之前,人们必须有某种方式来显示欧元。两种最常见的非标准编码之一是使用拉丁-1
80
/Unicode
U+0080
(另一种是
A4
/code>U+00A4)还有一些Java和Win32代码应用程序是为Unicode 2.0编写的,使用这种技术,目前仍在广泛使用,并且字体支持它们。

您的代码、文件或其他任何东西都没有问题

您正确地将
chr(128)
,aka,aka作为UTF-8写入Unicode控制字符。该文件将具有该字符的UTF-8编码(两个字节
\xc2\x80

当您在未指定的第一个程序中查看它时(可能您只是将它设置为任何终端?),它正确地将这两个字节读取为字符U+0800的UTF-8,并显示其所选字体具有的该字符的任何图像

当您在PyCharm中查看它时,它也正确地读取U+0800并使用所选字体显示它

唯一的区别是它们使用不同的字体。不同的字体对不可打印的控制字符有不同的作用。(此字符没有标准的呈现方式。它在Unicode中没有特定的含义,但映射到拉丁语-1补充字符
0x80
,定义为控制字符“PAD”,是“Padding Character”的缩写。1)不同的东西可能有用,所以不同的字体可以做不同的事情:

  • 向您显示控制字符的十六进制值可能对在shell中使用Unicode的人很有用,因此您的终端(或其他任何终端)被配置为使用一种字体向他们指明方向
  • 通过使用通用替换box2向您显示这可能是您不想打印的内容也是合理的,因此PyCharm配置了一种字体来实现这一点
  • 只是
    file = open('output.txt', 'w', encoding = 'utf-8')