Unicode 转义不适用于某些字符
Posted
技术标签:
【中文标题】Unicode 转义不适用于某些字符【英文标题】:Unicode escape won't work with some characters 【发布时间】:2015-07-30 17:59:04 【问题描述】:我有一个程序,我想在其中使用一些 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')
你用什么做控制台?当我使用 Windows 命令提示符时,我得到 cp437
,它同样失败,当我使用 Idle 时,我得到 utf-8
,它不会产生错误但也不会打印正确的字符。
【参考方案1】:
Windows 控制台根本不支持使用 C 标准库 I/O 函数的应用程序的 Unicode(就像 Python 一样)。
虽然原则上您可以按照其他 cmets 的建议将代码页更改为 65001(并将 PYTHONIOENCODING 环境变量设置为 utf-8 以匹配),但实际上控制台主机对此代码页,这样您在尝试使用它时可能会出现双重打印或挂起。这通常是不可用的。
从 Windows 控制台中获取 Unicode 的可靠方法(好吧,尽可能可靠 - 用户仍然必须选择 TTF 字体才能有机会看到它)是调用 Win32 WriteConsoleW
/ ReadConsoleW
直接运行,而不是依赖于 C 标准库。如果您真的需要这样做,win_unicode_console 包会为您打包。
(通常更简单的选择是放弃 Windows 控制台并使用其他环境,例如 IDE。)
【讨论】:
明确地说,我最终想在 IDE 中使用它,而不仅仅是让它在控制台中工作。您链接的软件包也可以帮助我吗? win_unicode_console 不应在 Windows 控制台以外的环境中执行任何操作。带有自己的 REPL 的 IDE 通常应该自然地支持 Unicode,而无需做任何特别的事情(尽管过去有些有错误)。【参考方案2】:要在 Windows 中设置命令提示符以显示 utf-8 字符串,请使用 chcp
命令(对于 utf-8 执行 - chcp 65001
) -
chcp 65001
对于其他此类编码及其对应的代码页(cp),请查看here。
【讨论】:
【参考方案3】:这是因为你的控制台的默认编码是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
或者您也可以以图形方式更改它,查看此问题以获取更多信息:Unicode characters in Windows command line - how?
【讨论】:
这不是我想要的角色;我想要一个下标 p。我需要使用不同的 unicode 转义吗? @jmcampbell 你说的unicode escape
是什么意思?你的意思是另一种 unicode 编码?
我的意思是 unicode 字符串。例如,u"\xb5" 是希腊字母 mu 的 python unicode 转义。 u"\u209A" 应该是下标 p 的 unicode 转义,但它没有给出正确的字符。
我试图打印 u"\u209A".encode('utf-8'),它没有引发错误,但它打印了这个:â‚š
@jmcampbell 如果您更改默认编码会怎样?做import sys reload(sys) sys.setdefaultencoding('UTF8')
,然后不加任何编码就打印出来。以上是关于Unicode 转义不适用于某些字符的主要内容,如果未能解决你的问题,请参考以下文章
nth-child自定义:用Unicode字符替换项目符号,并且不适用于嵌套的