【问题标题】:Converting between charsets in python在python中的字符集之间转换
【发布时间】:2013-04-21 21:27:42
【问题描述】:

我需要输出一些字符串(到标准输出),因为 windows 控制台在 cp437 中工作,如果字符串包含 cp437 之外的任何字符,则会引发异常。

我解决了这个问题

encoding=sys.stdout.encoding
pathstr = path.encode(encoding,errors="replace").decode(encoding)
print(pathstr)

path 是我想要输出的str。我可以用“?”替换字符

这似乎不太好,因为它转换为字节数组并返回到 str。

有没有更好的方法来实现这一点?

我还是 python 新手(也许一周),我正在使用 Win7 32 位和 cpython 3.3

【问题讨论】:

    标签: python unicode character-encoding python-3.x


    【解决方案1】:

    这似乎不太好,因为它转换为字节数组并返回到 str。

    如果您想将原始字节写入流,请使用.buffer

    pathbytes= path.encode(encoding, errors= 'replace')
    sys.stdout.buffer.write(pathbytes)
    

    ...哦,当issue 1602 出现时,我们可以避免 Windows 命令提示符的 Unicode 恐怖...

    【讨论】:

      【解决方案2】:

      我可以用“?”代替字符

      你可以设置PYTHONIOENCODING environment variable:

      C:\> set PYTHONIOENCODING=cp437:replace
      

      并直接打印Unicode字符串:

      print(path)
      

      在这种情况下,如果您要重定向到文件;您可以将 PYTHONIOENCODING 设置为 utf-8 并获得正确的完整输出。

      您也可以尝试 the corresponding Python bug 中基于 WriteConsoleW() 的解决方案,看看它们是否适用于 Python 3.3,例如:

      import _win_console
      _win_console.install_unicode_console()
      
      print("cyrillic: цык.")
      

      在哪里_win_console is from win_console.patch。在这种情况下您不需要设置环境变量,它应该适用于任何代码页(with an appropriate console font, it might even show characters outside the current codepage)

      所有在 Windows 控制台内打印 Unicode 问题的解决方案都有缺点(see the discussion and the reference links in the bug tracker for all the gory details)

      【讨论】:

        【解决方案3】:

        我听过的关于 Unicode 的最佳建议是制作 Unicode 三明治:

        1. 立即将程序中的任何传入文本转换为 unicode。
        2. 在您的程序中专门处理 Unicode。
        3. 导出为您希望输出的任何序列化格式。

        在这种情况下,您基本上就是这样做的。在更长的程序中,以您描述的方式执行此操作是有意义的,我认为您会对此感到更自在。

        我要做的唯一更改是编码为 utf-8,然后在输出时解码为 cp437。

        【讨论】:

        • 我无法理解你的最后一句话。您的意思是将您的 unicode 对象编码为 UTF-8 字符串,然后将其解码为 CP437 字符串?
        猜你喜欢
        • 1970-01-01
        • 2020-05-28
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2011-11-06
        相关资源
        最近更新 更多