python - Python 3.4、Unicode、不同的语言和 Windows 有什么关系?

标签 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)

不开心的输出:

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>

我还尝试了 this question 中的以下内容(以及其他涉及 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)

事情变得更加神秘:

リング 山村 貞子

And the docs were not very helpful .

那么,Python 3.4、Unicode、不同的语言和 Windows 有什么关系?我能找到的几乎所有可能的示例都涉及 Python 2.x。

在 Python 3.4 中,是否有一种通用且跨平台的方式可以从任何语言中以体面且不讨厌的方式打印任何 Unicode 字符?

编辑:

我尝试在终端输入:

chcp 65001

要更改代码页,as proposed here并在评论中,它不起作用(包括使用 sys.stdout.encoding 的尝试)

最佳答案

更新: Since Python 3.6, the code example that prints Unicode strings directly should just work now (even without py -mrun) .


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

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 控制台中配置可以显示所需字符的字体。

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

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

要写入文件/管道,请使用 PYTHONIOENCODING=utf-8 作为 @Mark Tolonen suggested :

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

只有最后一个解决方案支持非 BMP 字符,例如 😒 (U+1F612 UNAMUSED FACE) -- py -mrun 可以编写它们,但即使字体支持相应的 Unicode 字符,Windows 控制台也会将它们显示为框(尽管您可以将框复制粘贴到另一个程序中以获取字符)。

关于python - Python 3.4、Unicode、不同的语言和 Windows 有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539882/

相关文章:

python - 应用函数不适用于数据框列

python - Matplotlib savefig 只保存图像,不保存线条

Python sql语句错误

c++ - 不打印 5 个字母长的 unicode

unicode - 如何在golang中将utf16文本文件读取为字符串?

python - 如何在 Django 模板中使用法语字母?

python - Django 无法在 MySQL 中保存 unicode 字符串(操作错误 - 1366, "Incorrect string value")

python - 无法在 pynput 中选择文本

python - 如何检查数组中是否存在所有指定的键?

perl - 如何检查unicode文件名是否存在?