V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GeQi
V2EX  ›  编程

Windows 下的 Unicode 问题

  •  
  •   GeQi · 2015-05-04 13:08:26 +08:00 · 2689 次点击
    这是一个创建于 3277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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)"
    该怎么解决呢

    第 1 条附言  ·  2015-05-04 16:15:46 +08:00
    @cylin
    @infinte
    @imn1
    谢谢各位, 问题解决
    一下子反应过来, 不是 windows 的问题, 是 dropbox 的问题!
    dropbox 也是够快, 瞬间就把文件名转了...
    5 条回复    2015-05-04 14:54:57 +08:00
    imn1
        1
    imn1  
       2015-05-04 13:37:56 +08:00
    unicode F900-FAFF 是 CJK Compatibility Ideographs
    主要是对一些零散的异体字(多出现在印刷)作修正用的

    你这个字串的来源有点问题,5973(4E00-9FCC)才是正式的汉字字符范围
    应该先处理来源字串,再应用到路径使用,路径不应使用\uxxxx这种写法
    GeQi
        2
    GeQi  
    OP
       2015-05-04 14:06:58 +08:00
    @imn1 谢回复
    \uF981是直接网站上抓下来的, 本身网站也不是国内的
    至于报错信息里 \uxxxx 的写法只是 python3 在 cmd 里无字符的unicode的表示法而已 路径是没问题的
    linux还没试, 不过 windows 隐式转换 unicode 字符真是头疼, 完全不理解这是什么逻辑
    imn1
        3
    imn1  
       2015-05-04 14:17:50 +08:00
    因为windows的文件系统是混合编码,具体的原理我搞不清,反正不止一种编码
    而字体又跟编码有关,一般字体(至少windows自带那些)并不支持unicode,如果unicode规定了一些字符只是印刷修正用,与正式范围的某个字是相同的话,出于显示需要自动修正也是可以理解的,不然字体不能识别就会显示成问号了,有些时候还会造成路径错误(因为windows路径限制使用的字符比较多)
    cylin
        4
    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
        5
    infinte  
       2015-05-04 14:54:57 +08:00
    @GeQi 我怀疑是 Python 内部做了某种 Unicode 规范化或者转码造成的(这个过程可能会把 U+F981 转换成 U+5973)。WIN32 api 的 -W 系可以明确使用任意的 UTF-16 序列作为文件名。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1033 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:41 · PVG 03:41 · LAX 12:41 · JFK 15:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.