与Python 3.4,Unicode,不同语言和Windows有什么关系?

Eri*_*ans 24 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(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)

要更改代码页,如此处和注释中所提议的那样,它不起作用(包括使用sys.stdout.encoding的尝试)

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的更新

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)

  • Windows控制台可以使用`WriteConsoleW`打印任意Unicode字符串(受字体支持限制,但不能正确处理非BMP字符).Python不使用该功能; 有关讨论,请参阅https://bugs.python.org/issue1602. (3认同)

归档时间:

查看次数:

15557 次

最近记录:

8 年,8 月 前