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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP