【问题标题】:handling unicode strings in Windows在 Windows 中处理 unicode 字符串
【发布时间】:2011-07-22 09:35:41
【问题描述】:

第一次,我在 Windows (Vista) 上尝试了一个处理 unicode 字符的 Python 脚本,但发现它不起作用。该脚本在 Linux 和 OS X 上运行得很好,但在 Windows 上没有任何乐趣。这是我尝试过的小脚本:

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

import os, sys, codecs

reload(sys)
sys.setdefaultencoding('utf-8')
print "\nDefault encoding\t: %s" % sys.getdefaultencoding()
print "sys.stdout.encoding\t: %s\n" % sys.stdout.encoding

## Unicode strings
ln1 = u"?0>9<8~7|65\"4:3}2{1+_)(*&^%$£@!/`\\][=-"
ln2 = u"mnbvc xzasdfghjkl;'poiuyàtrewq€é#¢."

refStr = u"%s%s" % (ln2,ln1)
print "refSTR: ", refStr

for x in refStr:
    print "%s => %s" % (x, ord(u"%s" % x))

当我从 Windows CLI 运行脚本时,我收到此错误:

C:\Users\san\Scripts>python uniCode.py

Default encoding        : utf-8
sys.stdout.encoding     : cp850

refSTR;  Traceback (most recent call last):
  File "uniCode.py", line 18, in <module>
    print "refSTR; ", refStr
  File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u20ac' in position
 30: character maps to <undefined>

我遇到了this Python-wiki 并从那里尝试了一些东西,但没有奏效。有人知道我还缺少什么吗?非常感谢任何帮助。干杯!!

【问题讨论】:

  • 这是从 Python 3 开始可能有意义的一件事,它比 Python 2 更清楚 unicode 与字节。

标签: python unicode window


【解决方案1】:

Windows 控制台有一个 Unicode API,但没有 utf-8。 Python 正在尝试将 Unicode 字符编码为控制台的 8 位代码页 cp850,这显然行不通。据说 Windows 控制台中有一个支持 utf-8 的代码页 (chcp 65001),但它已严重损坏。阅读issue 1602 并查看sys_write_stdout.patchunicode2.py,它们使用Unicode 宽字符函数,例如WriteConsoleOutputWWriteConsoleW。不幸的是,这是一个低优先级的问题。

仅供参考,您还可以使用 IDLE 或其他 GUI 控制台(基于 pythonw.exe)来运行输出 Unicode 字符的脚本。例如:

C:\pythonXX\Lib\idlelib\idle.pyw -r script.py

但如果你需要编写 CLI 控制台工具,这不是一个通用的解决方案。

【讨论】:

  • 您是在说 Unicode,而您的意思是像 UCS-2 或 UTF16-BE 这样的 Microsoft 东西?否则我听不懂你在说什么。
【解决方案2】:

setdefaultencodinggetdefaultencoding 表示 Python 解释器后面的编码,当您使用 sys.stdout.encoding 时,它表示您的终端使用的编码。您可以验证这一点,如果您要将其写入文件而不是在终端中打印。

“修复”这个程序的方法是将终端编码设置为您想要的 (utf-8) 或写入文件并在支持这些特定字符的编辑器中打开输出。

【讨论】:

猜你喜欢
  • 2019-09-04
  • 2021-04-08
  • 1970-01-01
  • 2014-06-14
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2018-12-05
相关资源
最近更新 更多