2011-07-22 115 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