如何在Python 3.0中让print()输出UTF-8?

发布于 2024-07-13 06:56:35 字数 1235 浏览 9 评论 0原文

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

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

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 模块。


(请注意,“coding:”行指定的编码是源代码的编码,而不是控制台输出的编码。但是感谢您的想法!)

I'm working in WinXP 5.1.2600, writing a Python application involving Chinese pinyin, which has involved me in endless Unicode problems. Switching to Python 3.0 has solved many of them. But the print() function for console output is not Unicode-aware for some odd reason. Here's a teeny program.

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

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

Output is (changing angle brackets to square brackets for readability):

    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]

Note that ü = '\xfc' = 252 gives no problem since it's upper ASCII. But ā = '\u0101' is beyond 8 bits.

Anyone have an idea how to change the encoding of sys.stdout to 'utf-8'? Bear in mind that Python 3.0 no longer uses the codecs module, if I understand the documentation right.


(Note that the coding specified by the "coding:" line is the coding of the source code, not of the console output. But thank you for your thoughts!)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

感性不性感 2024-07-20 06:56:37

在 Windows 中用 Python 显示 Unicode 字符的问题是已知的。 目前还没有官方解决方案。 正确的做法是使用 winapi 函数 WriteConsoleW。 构建一个可行的解决方案并非易事,因为还有其他相关问题。 不过,我开发了一个包来尝试修复 Python 的这个问题。 请参阅https://github.com/Drekin/win-unicode-console。 您还可以在那里阅读对该问题的更深入的解释。 该软件包也在 pypi 上 (https://pypi.python.org/pypi/win_unicode_console)并可以使用 pip 安装。

The problem of displaying Unicode charaters in Python in Windows is known. There is no official solution yet. The right thing to do is to use winapi function WriteConsoleW. It is nontrivial to build a working solution as there are other related issues. However, I have developed a package which tries to fix Python regarding this issue. See https://github.com/Drekin/win-unicode-console. You can also read there a deeper explanation of the problem. The package is also on pypi (https://pypi.python.org/pypi/win_unicode_console) and can be installed using pip.

泛泛之交 2024-07-20 06:56:36

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

请参阅此线程以获得完整的解释:
http://www.nabble.com /无法在Python-3-td21670662.html中打印Unicode字符

The Windows command prompt (cmd.exe) cannot display the Unicode characters you are using, even though Python is handling it in a correct manner internally. You need to use IDLE, Cygwin, or another program that can display Unicode correctly.

See this thread for a full explanation:
http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

只是我以为 2024-07-20 06:56:36

您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。 我写了一个页面来讲述我遇到的这个问题

You may want to try changing the environment variable "PYTHONIOENCODING" to "utf_8." I have written a page on my ordeal with this problem.

浅紫色的梦幻 2024-07-20 06:56:36

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

Check out the question and answer here, I think they have some valuable clues. Specifically, note the setdefaultencoding in the sys module, but also the fact that you probably shouldn't use it.

百思不得你姐 2024-07-20 06:56:36

这是一个肮脏的黑客:

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

然而一切都破坏了它:

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

    # 不起作用 
      导入操作系统 
      os.system("chcp 65001 >nul &") 
      print("юникод") 
      
  • 检查操作系统类型破坏了它:

    # 不起作用 
      导入操作系统 
      如果 os.name == "nt": 
          os.system("chcp 65001 &") 
    
      print("юникод") 
      
  • 它甚至在 if 块下不起作用:

    # 不起作用 
      导入操作系统 
      如果 os.name == "nt": 
          os.system("chcp 65001 &") 
          print("юникод") 
      

但是可以使用 cmd 的 echo: 进行打印,

# 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 尾随空行无法被抑制。

Here's a dirty hack:

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

However everything breaks it:

  • simple muting first line already breaks it:

    # doesn't work
    import os
    os.system("chcp 65001 >nul &")
    print("юникод")
    
  • checking for OS type breaks it:

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

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

But one can print with cmd's echo:

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

and here's a simple way to make this cross-platform:

# 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("юникод")

but the window's echo trailing empty line can't be suppressed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文