Unicode转义在某些字符上无法正常工作。

3
我有一个程序需要使用一些Unicode字符,例如µ和下标p。但当我这样做时,
print u"\xb5"

它的功能非常完美,但当我这样做时,

print u"\u209A"

我收到了以下错误信息:
Traceback (most recent call last):
  File "C:/Users/tech/Desktop/Circuit Design Tool/Test 2.py", line 1, in <module>
    print u"\u209A"
  File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u209a' in position 0: character maps to <undefined>

为什么会这样?这些是正确的Unicode转义符吗?

print u"\u209A".encode('utf8') - heinst
你用什么控制台?当我使用Windows命令提示符时,我得到了cp437,它会类似地失败,而当我使用Idle时,我得到了utf-8,它不会生成错误,但也无法正确打印字符。 - Mark Ransom
3个回答

1

Windows控制台不支持使用C标准库I/O函数的应用程序的Unicode(像Python支持的那样)。

虽然原则上你可以像其他评论建议的那样,将代码页更改为65001(并将PYTHONIOENCODING环境变量设置为utf-8以匹配),但实际上,控制台主机对此代码页的支持存在一些长期存在的错误,因此在尝试使用它时可能会出现重复打印或挂起。这通常是无法使用的。

从Windows控制台获取Unicode的可靠方法(嗯,尽可能地可靠——用户仍然必须选择TTF字体才有可能看到它)是直接调用Win32 WriteConsoleW/ReadConsoleW函数,而不是依赖于C stdlib。如果你真的需要这么做,win_unicode_console包将为你提供封装。

(通常,一个更简单的选项是放弃Windows控制台并使用其他环境,比如IDE。)


需要明确的是,我最终想在IDE中使用它,而不仅仅是在控制台中使其工作。您提供的包是否也可以帮助我实现这一点? - jmcampbell
win_unicode_console 在除 Windows 控制台之外的环境中不应起作用。带有自己 REPL 的 IDE 通常应自然支持 Unicode,无需进行任何特殊操作(尽管过去某些 IDE 存在错误)。 - bobince

0

要在Windows中设置命令提示符以显示UTF-8字符串,请使用chcp命令(对于UTF-8,请使用chcp 65001)-

chcp 65001

对于其他类似的编码及其对应的代码页(cp),请查看这里


0
那是因为您的控制台默认编码为cp1252,无法解码Unicode。相反,您需要另一种适当的编码,例如utf-8
由于我的终端默认编码为utf-8,所以它可以正确打印:
>>> print u"\u209A"
ₚ

但是如果我使用编码cp1252,它会引发一个错误,就像你所遇到的:

>>> u"\u209A".encode('cp1252')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/encodings/cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character '\u209a' in position 0: character maps to <undefined>
>>> 

您可以使用以下命令在Windows中将默认编码更改为utf8

chcp 65001

或者您也可以通过图形方式进行更改,有关详细信息,请参阅此问题:Windows命令行中的Unicode字符-如何?


那不是我想要的字符;我想要下标 p。我需要使用不同的 Unicode 转义吗? - jmcampbell
@jmcampbell 你所说的“unicode转义”是什么意思?你是指另一种Unicode编码吗? - Mazdak
我的意思是unicode字符串。例如,u"\xb5"是希腊字母mu的python Unicode转义符。u"\u209A"应该是下标p的Unicode转义符,但它并没有给出正确的字符。 - jmcampbell
@jmcampbell 如果你执行 chcp 65001 然后打印它呢? - Mazdak
@jmcampbell 阅读此问题以获取更多信息 https://dev59.com/3XRC5IYBdhLWcg3wK9yV - Mazdak
显示剩余8条评论

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