繁体   English   中英

python 3.0,如何使print()输出unicode?

[英]python 3.0, how to make print() output unicode?

我正在使用WinXP 5.1.2600,编写一个涉及中文拼音的Python应用程序,这让我遇到了无数的Unicode问题。 切换到Python 3.0已经解决了许多问题。 但是由于一些奇怪的原因,控制台输出的print()函数不支持Unicode。 这是一个很小的计划。

print('sys.stdout encoding is "' + sys.stdout.encoding + '"')
str1 = 'lüelā'
print(str1)

输出为(为了便于阅读,将尖括号更改为方括号):

sys.stdout encoding is "cp1252"
    Traceback (most recent call last):
      File "TestPrintEncoding.py", line 22, in [module]
        print(str1)
      File "C:\Python30\lib\io.py", line 1491, in write
        b = encoder.encode(s)
      File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode
        return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' 
    in position 4: character maps to [undefined]

请注意,ü= \\ xfc = 252没有问题,因为它是高位ASCII。 但是ā= \\ u0101超过了8位。

任何人都知道如何将sys.stdout的编码更改为'utf-8'? 请记住,如果我理解文档正确,Python 3.0不再使用codecs模块。


道歉,我给你的程序没有序言。 在给出3行之前,它开始如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

不幸的是,“coding:”行指定的编码是源代码的编码 ,而不是控制台输出的编码。 但是谢谢你的想法!

Windows命令提示符(cmd.exe)无法显示您正在使用的Unicode字符,即使Python在内部以正确的方式处理它。 您需要使用IDLE,Cygwin或其他可以正确显示Unicode的程序。

有关完整说明,请参阅此主题: http//www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。 我已经在这个问题上写了一篇关于我的考验页面

看看这里的问题和答案,我认为他们有一些有价值的线索。 具体来说,请注意sys模块中的setdefaultencoding ,以及您可能不应该使用它的事实。

在Windows中以Python显示Unicode字符的问题是已知的。 还没有正式的解决方案。 正确的做法是使用winapi函数WriteConsoleW。 由于存在其他相关问题,因此构建工作解决方案并不重要。 但是,我已经开发了一个包,试图修复Python关于这个问题。 请参阅https://github.com/Drekin/win-unicode-console 您还可以在那里阅读有关该问题的更深入的解释。 该软件包也在pypi上( https://pypi.python.org/pypi/win_unicode_console ),可以使用pip安装。

这是一个肮脏的黑客:

# works
import os
os.system("chcp 65001 &")
print("юникод")

但是一切都打破了:

  • 简单的静音第一行已经打破了它:

     # doesn't work import os os.system("chcp 65001 >nul &") print("юникод") 
  • 检查操作系统类型会破坏它:

     # doesn't work import os if os.name == "nt": os.system("chcp 65001 &") print("юникод") 
  • 如果阻止它甚至不起作用:

     # doesn't work import os if os.name == "nt": os.system("chcp 65001 &") print("юникод") 

但是可以用cmd的回声打印:

# works
import os
os.system("chcp 65001 & echo {0}".format("юникод"))

这是制作这种跨平台的简单方法:

# works

import os

def simple_cross_platrofm_print(obj):
    if os.name == "nt":
        os.system("chcp 65001 >nul & echo {0}".format(obj))
    else:
        print(obj)

simple_cross_platrofm_print("юникод")

但窗口的echo尾随空行无法抑制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM