Python 板


LINE

分享一个这两天遇到焦头烂额的问题 在 M$ Windows 上档名有时会碰到表意文字补充区[1]的字 他不列在 CP950 (Big5) 里, 可是档名确实存在该字 如果用 Python os.listdir() 或 Popen('dir',...) 读出来的话, 会自动转为 CP950 的同义字 (也就是说该字会被偷偷改成别的字) .. [1]: http://en.wikipedia.org/wiki/CJK_Compatibility_Ideographs_Supplement 这里举一个表意文字的例子:: >>> s = u'\u57fa\uf90a' >>> print s 基金 >>> s.encode('CP950') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'cp950' codec can't encode character u'\uf90a' in position 1: illegal multibyte sequence 从 print out 的结果看来, 这个 "金" 字没有异常 但事实上他根本不是一般的 "金" 字 (正常的 "金" 理应为 u'\u91d1') 在 M$ Windows 上, 如果复制 ``print s`` 的结果存成一个档名, 将会遇到以下状况:: >>> import os; A = os.listdir('.'); A ['\xb0\xf2\xaa\xf7'] >>> A[-1].decode('CP950') u'\u57fa\u91d1' >>> open(A[-1]) Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: '\xb0\xf2\xaa\xf7' 显然原因是 "金" 那个字从根本上被改掉了, 所以档案找不到 然後? 然後我们设计的程式就爆炸了.....(上百个档案都有这个字....) 原来正确的作法是 **给予 path 时就使用 unicode** :: >>> import os; A = os.listdir(u'.'); A [u'\u57fa\uf90a'] 往後所有字串都使用 unicode 操作, 就不会爆炸了 据说事实上 M$ Windows 存档名就是用 unicode 我还没找到 "nt" 这个内建的 module 的 source code , 还不清楚它是 怎麽实作/呼叫哪个函数 的 -- 因为 BBS 上不吃 u'\uf90a', 所以直接从上面文字叙述中复制 "金" 字是没用的喔! 当我复制贴上文章的那一瞬间, u'\uf90a' 又被转成 u'\u91d1' 了... --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.136.219
1F:→ uranusjr:Windows 是用 UTF-16, 不过以微软的语言这个是叫 Unicode 02/28 02:03
2F:推 zha0:我以前也遇过, 那时用 python 2.x, 最後用 win32 api 找档 03/01 13:26
3F:→ apua:敢问楼上 win32api 如何取得档名 (eg: listdir 功能)? 03/03 15:48
4F:→ apua:因为我们曾试着找过但失败了 (win32api 文件写的有点差?) 03/03 15:49
5F:→ uranusjr:给楼上 http://d.pr/MEXg 03/03 17:58
6F:→ apua:thx 03/04 09:41







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

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

TOP