快乐的例子:
#!/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)
Run Code Online (Sandbox Code Playgroud)
不愉快的输出:
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'
Run Code Online (Sandbox Code Playgroud)
如果我像这样打印它们:
jp = u'??? ?? ??'
print(jp)
Run Code Online (Sandbox Code Playgroud)
我明白了:
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>
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下问题(以及涉及的其他替代方案sys.stdout.encoding
):
#!/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)
Run Code Online (Sandbox Code Playgroud)
事情变得更加神秘:
?â¬?â??é? ???µ¥æ ????¡É
Run Code Online (Sandbox Code Playgroud)
那么,Python 3.4,Unicode,不同语言和Windows的处理是什么?几乎所有可能的例子我都能找到,处理Python 2.x.
是否有一种通用的跨平台方式在Python 3.4中以一种体面和非讨厌的方式从任何语言打印任何Unicode字符?
编辑:
我试过在终端打字:
chcp 65001
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 18
更新: 从Python 3.6开始,直接打印Unicode字符串的代码示例现在应该可以正常工作(即使没有py -mrun
).
Python可以在Windows控制台中以多种语言打印文本chcp
:
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Run Code Online (Sandbox Code Playgroud)
在哪里your_script.py
直接打印Unicode,例如:
#!/usr/bin/env python3
print('š á?') # cz
print('? ?') # pl
print('???') # jp
print('??') # cn
print('? ? ?? ?') # ru
print('í çáà') # pt
Run Code Online (Sandbox Code Playgroud)
您只需在Windows控制台中配置可显示所需字符的字体即可.
您还可以通过IDLE运行Python脚本,而无需安装非stdlib模块:
T:\> py -midlelib -r your_script.py
Run Code Online (Sandbox Code Playgroud)
要写入文件/管,使用PYTHONIOENCODING=utf-8
如@马克Tolonen建议:
T:\> set PYTHONIOENCODING=utf-8
T:\> py your_script.py >output-utf8.txt
Run Code Online (Sandbox Code Playgroud)
只有最后一个解决方案支持非BMP字符,例如(U + 1F612 UNAMUSED FACE) - py -mrun
可以编写它们但Windows控制台将它们显示为框,即使字体支持相应的Unicode字符(尽管您可以将这些框复制粘贴到另一个程序中) ,获得角色).
Mar*_*nen 12
问题是是(见下面的Python 3.6更新)与Windows控制台,它支持一个ANSI字符由您的Windows版本所针对的区域设置适当的.默认情况下,当输出不支持的字符时,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: çáà
Run Code Online (Sandbox Code Playgroud)
请注意,美国OEM代码页仅限于ASCII和一些西欧字符.
下面我指示Python使用UTF8,但由于Windows控制台不支持它,我将输出重定向到一个文件并在记事本中显示:
C:\>set PYTHONIOENCODING=utf8
C:\>example >out.txt
C:\>notepad out.txt
Run Code Online (Sandbox Code Playgroud)
在Windows上,最好在使用多种语言时使用支持UTF-8而不是控制台的Python IDE.如果仅使用一种语言,请在Region and Language
控制面板中将其选为系统区域设置,控制台将支持该语言的字符.
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)
Run Code Online (Sandbox Code Playgroud)
输出:
Leoš Janá?ek
Zdzis?aw Beksi?ski
??? ?? ??
??
?????? ??? ?????????? ????????
Minha Língua Portuguesa: çáà
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15557 次 |
最近记录: |