Python3.4、Unicode、不同语言和Windows有什么好处?

Python3.4、Unicode、不同语言和Windows有什么好处?,python,unicode,Python,Unicode,快乐的例子: #!/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(chine

快乐的例子:

#!/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>
事情变得更加神秘:

リング 山村 貞子

那么,Python3.4、Unicode、不同语言和Windows有什么好处呢?我能找到的几乎所有可能的例子都涉及Python2.x

在Python3.4中,是否有一种通用的跨平台方法可以以一种体面的、非恶意的方式从任何语言打印任何Unicode字符

编辑:

我试着在终端输入:

chcp 65001
若要更改代码页和注释中的代码页,包括尝试使用sys.stdout.encoding,该操作不起作用,问题在于请参阅下面使用Windows控制台的Python 3.6更新,该控制台支持适合您的Windows版本所针对区域的ANSI字符集。默认情况下,Python在输出不支持的字符时抛出异常

Python可以读取以其他编码输出的数据,或者更改错误处理默认值。下面,我已经阅读了控制台默认设置,并将默认错误处理更改为打印?而不是为控制台当前代码页中不支持的字符引发错误

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控制台不支持UTF8,我将输出重定向到一个文件,并在记事本中显示它:

C:\>set PYTHONIOENCODING=utf8
C:\>example >out.txt
C:\>notepad out.txt
在Windows上,当使用多种语言时,最好使用支持UTF-8的Python IDE,而不是控制台。如果只使用一种语言,请在区域和语言控制面板中选择它作为系统区域设置,控制台将支持该语言的字符

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

#!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可以在Windows控制台中以多种语言打印文本,无论chcp说什么:

如果您的_script.py直接打印Unicode,例如:

#!/usr/bin/env python3
print('š áč')      # cz
print('ł ń')       # pl
print('リング')     # jp
print('五行')      # cn
print('ш я жх ё') # ru
print('í çáà')    # pt
您只需在Windows控制台中配置可以显示所需字符的字体

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

T:\> py -midlelib -r your_script.py
要写入文件/管道,请使用pythonionecoding=utf-8作为:


只有最后一个解决方案支持非BMP字符,如看起来适用的字符,您的控制台未配置为Unicode输出;我认为问题不在于Python,而在于Windows控制台,它只有一个代码页,默认情况下不是unicode代码页。请尝试chcp 65001将其设置为UTF-8代码页。摘自。我希望得到与我放入字符串中相同的内容。Windows控制台可以打印Unicode字符串,前提是字体支持它,使用WriteConsoleW。但是Python没有使用它,请参阅。Windows控制台可以使用WriteConsoleW打印任意Unicode字符串,但受到字体支持的限制,并且不能正确处理非BMP字符。Python不使用该函数;有关讨论,请参阅。Python 3.6:您需要配置控制台:右键单击cmd或Python IDLE窗口顶部,在默认情况下/font选择Lucida控制台。@Guillaume,这对中文/日语没有帮助。我在Windows10中安装了中文语言包,然后新的控制台字体就可以使用了。SimSun字体看起来不错,支持上述所有六种语言。您将如何制作交互式版本?我猜Python是Python-I-m run,但我无法理解ipython,即使win unicode控制台的页面上声明它是集成的。@zsero:e.g.,py-I-m run c:\path\to\ipython。您还可以使用qtconsole接口或。如果它不适合你;另外问一个问题,关于你想对ipython做什么,以及什么失败了。@eryksun:不。请注意使用了py-mrun。@sebastian我想我在你的帮助下解决了我的问题。您的答案有点让人困惑:作为一名python 3.6用户,我不明白我是否应该忽略或考虑您在下面所写的内容。如果是这样的话,对于上一个版本来说:将使其更加清晰。谢谢你的耐心!Lucida console也不支持中文或日语。
#!/usr/bin/env python3
print('š áč')      # cz
print('ł ń')       # pl
print('リング')     # jp
print('五行')      # cn
print('ш я жх ё') # ru
print('í çáà')    # pt
T:\> py -midlelib -r your_script.py
T:\> set PYTHONIOENCODING=utf-8
T:\> py your_script.py >output-utf8.txt