Python中的非ascii字符

时间:2011-04-04 14:10:15

标签: python

4 个答案:

答案 0 :(得分:3)

你必须使用utf-8而不是iso8859-2,如:

#-*- coding: utf-8 -*-
a = "ű"
print "ű"

输出继电器:

ű

此外,请确保您使用正确的编码保存了源代码文件(此处为utf-8)。

答案 1 :(得分:3)

其他答案提到指定编码并确保源文件是用它编码的,这两者都是正确的。此外,使用简单的引号只能在Python 3中使用。如果您使用的是Python 2,请在前面插入u以使其成为Unicode字符串:

a = u"ű"
print u"ű"

编辑:您的控制台也可能没有正确显示Unicode字符;我遇到过那个。由于您的编辑器似乎显示正常,请尝试将输出重定向到文件并使用编辑器打开它。

答案 2 :(得分:3)

看起来您在美国的Windows控制台上使用Python。我这样说是因为你实际收到的字符是你打印的iso8859_2字符的cp437编码字符。很遗憾,cp437不支持ű。如果要查看该字符,则无法使用美国Windows控制台。使用Idle或Pythonwin。

您还应该使用Unicode字符串。当您使用coding: iso8859_2时,您声明“此源文件中的字符已使用ISO 8859-2转换表编码到磁盘。”如果您点击该链接,则会发现值251代表ű。如果将相同的字节值写入cp437终端,则会得到平方根符号。使用Unicode字符串,Python会将字节251转换为Unicode字符U + 0171,该字符唯一标识字符LATIN SMALL LETTER U WITH DOUBLE ACUTE。打印到终端时,如果可能,Python会将Unicode字符转换为终端编码,或者抛出错误而不是为不支持的字符编写垃圾。

实施例

# coding: iso8859_2
import unicodedata as ud
s = 'ű'
u = u'ű'
print 'ISO 8859-2 value:',ord(s)
print 'Unicode value:   ',ord(u)
print 'Unicode name:    ',ud.name(u)
print 'Unicode name of cp437 value %d: %s' % (ord(s),ud.name(s.decode('cp437')))

print s
print u

输出

ISO 8859-2 value: 251
Unicode value:    U+0171
Unicode name:     LATIN SMALL LETTER U WITH DOUBLE ACUTE
Unicode name of cp437 value 251: SQUARE ROOT
√
Traceback (most recent call last):
  File "C:\ex.py", line 11, in <module>
    print u
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0171' in position 0: character maps to <undefined>

所以你看到字节字符串打印出错误的平方根符号(√),而Unicode字符串正确显示不支持该字符。

答案 3 :(得分:1)

将编码更改为utf-8可以正常工作。

#-*- coding: utf-8 -*-
a = "ű"
print "ű"