如何用Windows版的Python在cmd中印出檔案內的Unicode字元 - Windows

Freda avatar
By Freda
at 2011-04-22T20:49

Table of Contents

※ [本文轉錄自 Python 看板 #1DiNRYzL ]

作者: Holocaust123 (奔跑的蝸牛) 看板: Python
標題: [問題] 如何用Windows版的Python在cmd中印出檔案內的Unicode字元
時間: Fri Apr 22 20:38:56 2011

我的 XP 灌了兩個Python

1. 從官網(www.python.org)下載的2.6.6版 執行檔路徑為C:\Python26\python.exe

2. 用Cygwin的套件管理器下載的2.6.5版 執行檔路徑為C:\cygwin\bin\python.exe


假設有個文字檔C:\saki 檔案編碼為utf8 檔案內容為"咲"(不含引號)

"咲"(saki)是所謂的日文漢字 並不包含在Big5字元集中

下面這個Python程式(C:\a.py)的目的是秀出stdout的編碼 然後把C:\saki的內容印出來

#coding=utf8
import sys
tenc = sys.stdout.encoding
print tenc
s1 = open(ur'C:/saki', 'r').read().decode('utf8').encode('utf8')
print s1
s2 = open(ur'C:/saki', 'r').read().decode('utf8').encode('big5')
print s2



現在 在相同的環境下(皆為cmd.exe) 用兩個不同的Python執行a.py 看結果如何


<實驗1>
C:>chcp
使用中字碼頁: 950

C:\>C:\Python26\python.exe a.py
cp950
??

Traceback (most recent call last):
File "a.py", line 7, in <module>
s2 = open(ur'saki', 'r').read().decode('utf8').encode('big5')
UnicodeEncodeError: 'big5' codec can't encode character u'\u54b2' in position 0:
illegal multibyte sequence

<實驗2>
C:>chcp
使用中字碼頁: 950

C:\>C:\cygwin\bin\python.exe a.py
None


Traceback (most recent call last):
File "a.py", line 7, in <module>
s2 = open(ur'saki', 'r').read().decode('utf8').encode('big5')
UnicodeEncodeError: 'big5' codec can't encode character u'\u54b2' in position 0:
illegal multibyte sequence


結果顯示

官網的Python印出無法在cmd中印出Unicode字元, 取而代之的是問號"??"

Cygwin的Python印出可以正確印出Unicode字元"咲"

然後我是故意產生UnicodeEncodeError這個例外的 目的只是證明"咲"不在Big5 Charset裏


看了這樣的執行結果 產生了幾個疑問:

Q1. 為什麼用官網的Python在cmd中印不出Unicode字元 用Cygwin Python卻可以呢?

Q2. 為什麼同樣是在 cmd.exe 執行 a.py

兩個stdout encoding(上面標綠色的部分)卻不一樣呢?

(一個是cp950 一個是None)

Q3. 為什麼實驗2的stdout是None 而不是UTF-8呢?

我的 ~/.bashrc 明明有 export LANG='zh-TW.UTF-8' 了呀?

Q4. 實驗2中 在chcp為950(即微軟修改的Big5)的情況下

為什麼Cygwin版的Python還是可以正確印出"咲"呢?


以下是我的猜測:

A1. Python可能是把環境的locale當作自己執行時的locale

自己執行時的locale會影響執行時的Character Encoding


在Cygwin(Linux)環境下

使用者指定locale時可同時指定Character Encoding

例如我在~/.bashrc中寫 export LANG=zh_TW.UTF-8

表示locale為中文-台灣 Character Encoding為UTF-8

Cygwin Python讀取LANG的值當作執行Python時用的locale及Character Encoding

於是可以正確印出UTF-8字元


然後是Windows

繁體中文版本的Windows預設locale是zh_TW

(可以透過 控制台>地區及語言選項>地區選項>標準及格式 來修改)

與Linux不同的是

在Windows中一旦locale被指定

Code Page(Character Encoding)似乎就定死了(這是我猜的 因為查不到改法)

就是cp950(cp = code page)

Windows Python讀取Windows的locale的值當作執行Python時用的locale及Charset

於是就印不出UTF-8字元了


若我以上的猜測是對的

想用Windows Python在cmd.exe印出Unicode字元

就必須先讓Python使用的Code Page是UTF-8才行

在Linux下export LANG=zh_TW.UTF-8就行了

但...Windows下要怎麼做呢??

或者

有沒有辦法直接修改Windows Python的source

來強制指定 locale-charset 為 zh_TW.UTF-8 呢?

A2. Python可能是把環境的locale當作自己執行時的locale

自己執行時的locale會影響執行時的Character Encoding

所以會影響 sys.stdout.encoding

A3. 不清楚 可能性太多了

總之大概是這種情況下不會 source ~/.bashrc 所以LANG是空的

所以sys.stdout.encoding也是空的

(我覺得這個問題網路上一定有人問過 還在survey中...)

A4. 不清楚(這我超想知道的 拜託會的人教一下 orz)


不知道我講的對不對 有錯還請多多指教

我真的很想知道正確答案...

--
Tags: Windows

All Comments

Madame avatar
By Madame
at 2011-04-26T11:46
跟本版有關的是文中的Q4(第四個問題) 但若有人會其他
Blanche avatar
By Blanche
at 2011-04-29T08:39
的問題也請多多指教orz

vista更新後視窗解析度

Andy avatar
By Andy
at 2011-04-22T19:39
不知道是不是更新後的問題 字體變了…還有視窗變成這樣 http://img848.imageshack.us/i/28781580.jpg/ 跟這樣 http://img15.imageshack.us/i/19105791.jpg/ 請問有人知道如何解決嗎~謝謝 左邊被切掉了啊 囧 ...

請問WIN7如何改圖示

Jake avatar
By Jake
at 2011-04-22T16:53
因為無個人化 上網也找不到 已經解決更改桌面背景 但我想改 我的電腦 垃圾桶等等ICO圖示 請問該如何做 謝謝 - ...

Windows Mail預覽視窗的迴紋針不見了?

Jake avatar
By Jake
at 2011-04-22T16:39
想請問各位大大, 我是用Vista的Windows Mail 之前收到的mail如果有附檔, 在預覽窗格裡的右上方都會有迴紋針出現, 並且點選迴紋針就可選擇開啟附檔或另存附檔, 但前一陣子卻發現,預覽窗格右上方的迴紋針不見了 信的主旨和寄件者還有收件者在預覽窗格都能看到 ...

win7 office2010 縮圖無法顯示

Liam avatar
By Liam
at 2011-04-22T15:30
系統:win7(校園版=企業版) SP1 32bit office2010 自從某一次(忘了哪一次)win7 update後 桌面上的office縮圖顯示通通不見了 變成白色像沒有適用程式可開啟的檔案一樣(但還是可開啟),更新上還有開啟 office也沒有顯示任何錯誤的訊息,現在有點懷念 ...

買筆電時的作業系統語言問題

Kumar avatar
By Kumar
at 2011-04-22T13:52
因為是一個日本人要用的,但是擔心台灣的筆電只能安裝中文系統 請問一下現在新買的筆電剛開始安裝時能選擇非中文的其他語言嗎? 另外新版的Windows 7能自動的切換其他語言嗎? 例如中andlt;-andgt;日或中andlt;-andgt;英,還是說版本有分呢? 要怎樣的版本才有呢? - ...