特殊字符显示为问号

5
使用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" 吗? - Farhadix
这是否意味着用户输入始终被编码为Unicode? - Måns Nilsson
1个回答

3
您正在使用Python 2,我假设您运行在像Linux这样的平台上,该平台使用UTF-8编码I/O。
Python 2的""字面值表示字节串。因此,当您在ISO 8859-1编码的源文件中指定"år"时,变量input的值为b'\xe5r'。当您打印它时,原始字节将输出到控制台,但由于它们不是有效的UTF-8,所以会显示为问号。
为了演示,请尝试使用print repr(a)而不是print a。
当您使用raw_input()时,用户的输入已经是UTF-8编码的,因此可以正确输出。
要解决此问题,请执行以下操作之一:
  • Encode your string as UTF-8 before printing it:

    print a.encode('utf-8')
    
  • Use Unicode strings (u'text') instead of byte-strings. You will need to be careful with decoding the input, since on Python 2, raw_input() returns a byte-string rather than a text string. If you know the input is UTF-8, use raw_input().decode('utf-8').

  • Encode your source file in UTF-8 instead of iso-8859-1. Then the byte-string literal will already be in UTF-8.


非常感谢!通过添加.decode('utf-8')部分,问题得以解决。非常感谢! :) - Måns Nilsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接