特殊字符显示为问号

Mån*_*son 5 python encoding input character output

使用 Python 编程语言时,我无法输出 å、ä 和 ö 等字符。下面的代码给了我一个问号 (?) 作为输出,而不是一个 å:

#coding: iso-8859-1
input = "å"
print input
Run Code Online (Sandbox Code Playgroud)

以下代码可让您输入随机文本。for 循环遍历输入的每个字符,将它们添加到字符串变量 a 中,然后输出结果字符串。此代码正常工作;您可以输入 å、ä 和 ö,输出仍然正确。例如,“år”按预期输出“år”。

#coding: iso-8859-1
input = raw_input("Test: ")
a = ""
for i in range(0, len(input)):
    a = a + input[i]
print a
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我更改input = raw_input("Test: ")input = "år",它会为“å”输出一个问号 (?)。

#coding: iso-8859-1
input = "år"
a = ""
for i in range(0, len(input)):
     a = a + input[i]
print a
Run Code Online (Sandbox Code Playgroud)

就其价值而言,我正在使用 TextWrangler,并且我的文档的字符编码设置为 ISO Latin 1。这是什么原因造成的?我该如何解决问题?

Mec*_*ail 3

您正在使用 Python 2,我假设在像 Linux 这样以 UTF-8 编码 I/O 的平台上运行。

\n\n

Python 2 的""文字表示字节字符串。因此,当您"\xc3\xa5r"在 ISO 8859-1 编码的源文件中指定时,该变量的input值为b\'\\xe5r\'。当您执行print此操作时,原始字节将输出到控制台,但显示为问号,因为它们不是有效的 UTF-8。

\n\n

为了演示,请尝试使用print repr(a)而不是print a

\n\n

当您使用 时raw_input(),用户的输入已经是 UTF-8 编码的,因此可以正确输出。

\n\n

要解决此问题,可以执行以下任一操作:

\n\n
    \n
  • 在打印之前将字符串编码为 UTF-8:

    \n\n
    print a.encode(\'utf-8\')\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 使用 Unicode 字符串 ( u\'text\') 而不是字节字符串。您需要小心解码输入,因为在 Python 2 上,raw_input()返回字节字符串而不是文本字符串。如果您知道输入是 UTF-8,请使用raw_input().decode(\'utf-8\').

  • \n
  • 使用 UTF-8 而不是 iso-8859-1 对源文件进行编码。那么字节字符串文字就已经是 UTF-8 格式了。

  • \n
\n