2011-07-22 60 views
2

我第一次尝试使用我的一个Python脚本处理Windows(Vista)上的unicode字符,并发现它不起作用。该脚本在Linux和OS X上运行得非常好,但在Windows上没有任何喜悦。这里是我试过的小脚本:在Windows中处理unicode字符串

#!/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运行命令行脚本,我得到这个错误:

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,并从那里尝试了一些东西,但那个没有工作。有谁知道我还缺少什么?任何帮助不胜感激。干杯!!

+1

这是一个从Python 3开始的例子,它比Python 2更清楚Unicode字节和字节。 –

回答

5

Windows控制台有一个Unicode API,但不是utf-8。 Python试图将Unicode字符编码到控制台的8位代码页cp850,这显然不起作用。据推测,Windows控制台中的代码页(chcp 65001)支持utf-8,但严重损坏。阅读issue 1602并查看sys_write_stdout.patchunicode2.py,它们使用Unicode宽字符功能,例如WriteConsoleOutputWWriteConsoleW。不幸的是这是一个低优先级的问题。可以使用IDLE或其他GUI控制台(基于pythonw.exe)来运行输出Unicode字符的脚本。例如:

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

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

+0

感谢您的信息。看着它。干杯!! – MacUsers

+0

当你的意思是像UCS-2或UTF16-BE这样的微软事物时,你是在说* Unicode吗?否则我不明白你在说什么。 – tchrist

1

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

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

+0

对不起我的一个愚蠢的问题:如何将终端编码设置为utf-8?干杯!! – MacUsers

+0

@MacUsers:您可以使用Google。你会发现这一点:http://technet.microsoft.com/en-us/library/bb490874.aspx –

+0

@ S.Lott:我在谷歌尝试了几种组合,但迄今为止没有任何帮助。我还没有遇到你发送的链接,但我没有在那里看到UTF-8。我看到最接近拉丁-1。干杯!! – MacUsers