Windows 下的 Unicode 问题

2015-05-04 13:08:26 +08:00
 GeQi

用 python3 写的一个下载P站图片的工具
下载这个地址的时候报错了

FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Qi\Dropbox\Python\Projects\PixivAgent\Download\\u2727\uf981神\u2727 48802520\48802520.jpg'

幸好这个时候 dropbox 也报了异常, 才发现是 windows 下的"女(U+F981)"被自动转成了"女(U+5973)"
该怎么解决呢

2707 次点击
所在节点    编程
5 条回复
imn1
2015-05-04 13:37:56 +08:00
unicode F900-FAFF 是 CJK Compatibility Ideographs
主要是对一些零散的异体字(多出现在印刷)作修正用的

你这个字串的来源有点问题,5973(4E00-9FCC)才是正式的汉字字符范围
应该先处理来源字串,再应用到路径使用,路径不应使用\uxxxx这种写法
GeQi
2015-05-04 14:06:58 +08:00
@imn1 谢回复
\uF981是直接网站上抓下来的, 本身网站也不是国内的
至于报错信息里 \uxxxx 的写法只是 python3 在 cmd 里无字符的unicode的表示法而已 路径是没问题的
linux还没试, 不过 windows 隐式转换 unicode 字符真是头疼, 完全不理解这是什么逻辑
imn1
2015-05-04 14:17:50 +08:00
因为windows的文件系统是混合编码,具体的原理我搞不清,反正不止一种编码
而字体又跟编码有关,一般字体(至少windows自带那些)并不支持unicode,如果unicode规定了一些字符只是印刷修正用,与正式范围的某个字是相同的话,出于显示需要自动修正也是可以理解的,不然字体不能识别就会显示成问号了,有些时候还会造成路径错误(因为windows路径限制使用的字符比较多)
cylin
2015-05-04 14:46:19 +08:00
windows7 简体中文 python3.4.2 测试正常,没有被转换
>>> fp=open('\u2727\uf981神\u2727.txt','wb')
>>> fp.write(b'test')
4
>>> fp.close()
>>> fp=open('\u2727\uf981神\u2727.txt','rb')
>>> fp.read(4)
b'test'
>>>
infinte
2015-05-04 14:54:57 +08:00
@GeQi 我怀疑是 Python 内部做了某种 Unicode 规范化或者转码造成的(这个过程可能会把 U+F981 转换成 U+5973)。WIN32 api 的 -W 系可以明确使用任意的 UTF-16 序列作为文件名。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188315

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX