【问题标题】:Special characters appearing as question marks显示为问号的特殊字符
【发布时间】:2013-11-21 20:56:16
【问题描述】:

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

#coding: iso-8859-1
input = "å"
print input

以下代码可让您输入随机文本。 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

有趣的是,如果我将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

不管怎样,我使用的是 TextWrangler,并且我的文档的字符编码设置为 ISO Latin 1。这是什么原因造成的?我该如何解决这个问题?

【问题讨论】:

  • 你试过print u"år"吗?
  • 这是否意味着用户输入总是被编码为 Unicode?​​span>

标签: python input encoding character output


【解决方案1】:

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

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

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

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

要解决此问题,可以:

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

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

  • 将源文件编码为 UTF-8 而不是 iso-8859-1。那么字节字符串文字就已经是 UTF-8 格式了。

【讨论】:

  • 非常感谢!通过添加 .decode('utf-8') 部分,问题就解决了。非常感谢! :)
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 2019-01-17
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多