什么是Python 3.4,Unicode,不同的语言和Windows的处理?

快乐的例子:

#!/usr/bin/env python # -*- coding: utf-8 -*- czech = u'Leoš Janáček'.encode("utf-8") print(czech) pl = u'Zdzisław Beksiński'.encode("utf-8") print(pl) jp = u'リング 山村 貞子'.encode("utf-8") print(jp) chinese = u'五行'.encode("utf-8") print(chinese) MIR = u'Машина для Инженерных Расчётов'.encode("utf-8") print(MIR) pt = u'Minha Língua Portuguesa: çáà'.encode("utf-8") print(pt) 

不愉快的输出:

 b'Leo\xc5\xa1 Jan\xc3\xa1\xc4\x8dek' b'Zdzis\xc5\x82aw Beksi\xc5\x84ski' b'\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xb0 \xe5\xb1\xb1\xe6\x9d\x91 \xe8\xb2\x9e\xe5\xad\x90' b'\xe4\xba\x94\xe8\xa1\x8c' b'\xd0\x9c\xd0\xb0\xd1\x88\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\xb4\xd0\xbb\xd1\x8f \xd0\x98\xd0\xbd\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb5\xd1\x80\xd0\xbd\xd1\x8b\xd1\x85 \xd0\xa0\xd0\xb0\xd1\x81\xd1\x87\xd1\x91\xd1\x82\xd0\xbe\xd0\xb2' b'Minha L\xc3\xadngua Portuguesa: \xc3\xa7\xc3\xa1\xc3\xa0' 

如果我这样打印他们:

 jp = u'リング 山村 貞子' print(jp) 

我得到:

 Traceback (most recent call last): File "x.py", line 5, in <module> print(jp) File "C:\Python34\lib\encodings\cp850.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined> 

我也试过以下这个问题 (和涉及到sys.stdout.encoding其他select):

 #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import sys def safeprint(s): try: print(s) except UnicodeEncodeError: if sys.version_info >= (3,): print(s.encode('utf8').decode(sys.stdout.encoding)) else: print(s.encode('utf8')) jp = u'リング 山村 貞子' safeprint(jp) 

事情变得更加隐秘:

 リング 山村 貞子 

而文档不是很有帮助 。

那么,Python 3.4,Unicode,不同的语言和Windows有什么关系呢? 几乎所有可能的例子,我可以find,处理Python 2.x.

有没有一种通用的,跨平台的方式来打印任何语言的Unicode字符在Python 3.4体面和不讨厌的方式?

编辑:

我试过在terminal上打字

 chcp 65001 

要改变代码页, 就像这里和注释中提出的那样,它不起作用(包括使用sys.stdout.encoding的尝试)

问题在于 Windows控制台(请参阅下面的Python 3.6更新),该控制台支持适用于您的Windows版本所针对的区域的ANSI字符集。 当输出不支持的字符时,Python会默认引发exception。

Python可以读取一个环境variables来输出其他编码,或者改变error handling的默认值。 下面,我已经读过控制台的默认值,并更改默认的error handling打印一个? 而不是为控制台当前代码页中不支持的字符引发错误。

 C:\>chcp Active code page: 437 # Note, US Windows OEM code page. C:\>set PYTHONIOENCODING=437:replace C:\>example.py Leo? Janá?ek Zdzis?aw Beksi?ski ??? ?? ?? ?? ?????? ??? ?????????? ???????? Minha Língua Portuguesa: çáà 

请注意,美国的OEM代码页仅限于ASCII和一些西欧字符。

下面我已经指示Python使用UTF8,但是由于Windows控制台不支持它,我将输出redirect到一个文件并在记事本中显示:

 C:\>set PYTHONIOENCODING=utf8 C:\>example >out.txt C:\>notepad out.txt 

在这里输入图像描述

在Windows上,当使用多种语言时,最好使用支持UTF-8而不是控制台的Python IDE。 如果只使用一种语言,请在Region and Language控制面板中将其选为系统区域设置,控制台将支持该语言的字符。

更新Python 3.6

Python 3.6现在使用Windows Unicode API直接写入控制台,所以唯一的限制是控制台字体支持字符。 以下代码在美国的Windows控制台中工作。 我安装了一个中文语言包,如果控制台字体改变,它甚至会显示中文和日文。 即使没有正确的字体,控制台中也会显示replace字符。 剪切粘贴到此网页等环境将正确显示字符。

 #!python3.6 #coding: utf8 czech = 'Leoš Janáček' print(czech) pl = 'Zdzisław Beksiński' print(pl) jp = 'リング 山村 貞子' print(jp) chinese = '五行' print(chinese) MIR = 'Машина для Инженерных Расчётов' print(MIR) pt = 'Minha Língua Portuguesa: çáà' print(pt) 

输出:

 Leoš Janáček Zdzisław Beksińskiリング 山村 貞子五行Машина для Инженерных Расчётов Minha Língua Portuguesa: çáà 

更新: 自Python 3.6以来,直接打印Unicodestring的代码示例现在应该可以工作(即使不使用py -mrun ) 。


Python可以在Windows控制台中以多种语言打印文本,无论chcp说:

 T:\> py -mpip install win-unicode-console T:\> py -mrun your_script.py 

your_script.py直接打印Unicode,例如:

 #!/usr/bin/env python3 print('š áč') # cz print('ł ń') # pl print('リング') # jp print('五行') # cn print('ш я жх ё') # ru print('í çáà') # pt 

您所需要的只是在Windows控制台中configuration可显示所需字符的字体。

您也可以通过IDLE运行您的Python脚本,而无需安装非stdlib模块:

 T:\> py -midlelib -r your_script.py 

要写入文件/pipe道,使用PYTHONIOENCODING=utf-8作为@Mark Tolonenbuild议 :

 T:\> set PYTHONIOENCODING=utf-8 T:\> py your_script.py >output-utf8.txt 

只有最后一个解决scheme支持non (U + 1F612 UNAMUSED FACE)这样的非BMP字符 – py -mrun可以编写它们,但即使字体支持相应的Unicode字符,Windows控制台也会将它们显示为框(尽pipe您可以复制粘贴盒子变成另一个程序,得到这些字符)。