繁体   English   中英

将Windows-1251目录名称转换为Unicode(使用Python)

[英]Convert windows-1251 directory names to unicode (using Python)

我使用php脚本创建了目录,使用的是从网站(utf-8)提取的单词(类别名称),但是创建这些目录时,我看到的是不可读的字符,而不是真实的单词。

Windows下的AFAIK PHP在cp1251语言环境中有效,不能与utf-8文件名/目录名一起使用。

所以问题是,是否可以使用Python遍历所有目录并将它们重命名为utf-8字符集?

看起来像那段代码有效,现在我只需要递归遍历目录并重命名所有目录即可。

basedir = "C:\\Users\\alex\\Desktop\\1\\save"
dirs = os.listdir(basedir)
for fn in dirs:
    print fn
    nn = fn.decode('utf-8')
    os.rename(os.path.join(basedir,fn), os.path.join(basedir,nn))

需要澄清的几件事:

  • UTF-8是一种编码,而不是字符集。 字符集称为Unicode。 🎂是该字符集中的字符128169。

  • 字符串"🎂.txt"包含5个字符 您可以使用UTF-8或UTF-16这样的编码将这些字符编码为字节 计算机存储字节,因此程序必须使用这些编码之一来内部表示该字符串。

  • 结果,就没有“将目录重命名为Unicode字符集”之类的东西。 文件名🎂.txt是这5个字符,而不管操作系统是如何将这些字符存储在磁盘上的。

问题是PHP本身。 在Windows上,PHP在本地ANSI代码页中对字符串进行内部编码。 该代码页可能无法编码的字符🎂 ,所以PHP是不是能在内部表示此字符串。 结果,您将永远无法在PHP中访问文件🎂.txt 唯一的解决方法是使用特殊模块访问那些文件。 请参阅如何在PHP中打开名称为Unicode字符的文件?

如果php将utf-8文件名另存为cp1251,那么您可以将它们重新编码回去:

>>> correct_filename = u"торт.txt"
>>> mojibake = correct_filename.encode('utf-8').decode('cp1251') # WRONG
>>> print(mojibake) # if you see this;
торт.txt
>>> print(mojibake.encode('cp1251').decode('utf-8')) # recode
торт.txt

在Windows上,始终对文件名使用Unicode类型。

要重命名给定目录中的所有.txt文件:

#!/usr/bin/env python2
import os
from glob import glob

dirpath = os.path.expanduser(ur"~\Desktop\1\save")
for mojibake_path in glob(os.path.join(dirpath, '*.txt')):
    path = mojibake_path.encode('cp1251').decode('utf-8')
    os.rename(mojibake_path, path)

注意: dirpath是Unicode字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM