Python 板


LINE

我的 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) 不知道我講的對不對 有錯還請多多指教 我真的很想知道正確答案... --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.212.106 ※ 編輯: Holocaust123 來自: 114.35.212.106 (04/22 20:43)
1F:→ buganini:stdout encoding是cp950 python就會把他轉換過再輸出 04/23 02:00
2F:→ buganini:轉不過去就噴錯 None就不轉直接output所以就不會噴錯 04/23 02:00
3F:→ buganini:然後也要看程式跟windows tty之間用哪套api在溝通 04/23 02:01
4F:→ buganini:windows的api總是分兩套 一套吃unicode一套吃ANSI 04/23 02:01
5F:→ buganini:所謂ANSI就是locale based codepage 04/23 02:02
6F:→ buganini:吃unicode的那一套就是w開頭的東西 04/23 02:03
7F:→ buganini:亦即wchar_t 印象中cygwin的library是有正確使用unicode 04/23 02:05
8F:→ buganini:至少cwrsync用起來是這樣.. 04/23 02:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP