我使用php脚本创建目录,使用我从站点(utf-8)获取的单词(类别名称),但是当我创建这些目录时,我发现有不可读的字符而不是真实的话语。
Windows下的AFAIK PHP在cp1251
区域设置内工作,无法使用utf-8
文件名/ dirnames。
所以问题是,是否可以使用Python遍历所有目录并将它们重命名为utf-8 charset?
看起来这段代码有效,现在我只需要通过dirs进行递归遍历并重命名所有代码。
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))
答案 0 :(得分:2)
要澄清一些事项:
UTF-8是一种编码,而不是字符集。字符集称为Unicode。 是该字符集中的字符128169。
字符串".txt"
包含5个字符。您可以使用UTF-8或UTF-16等编码将这些字符编码为 bytes 。计算机存储字节,因此程序必须使用这些编码之一在内部表示该字符串。
因此,没有“将目录重命名为Unicode字符集”。无论操作系统如何将这些字符存储在磁盘上,文件名.txt
都是这5个字符。
问题在于PHP本身。在Windows上,PHP在本地ANSI代码页中对字符串进行内部编码。该代码页可能无法对字符进行编码,因此PHP无法在内部表示此字符串。因此,您永远无法访问PHP中的文件
.txt
。唯一的解决方法是使用特殊模块来访问这些文件。请参阅How to open file in PHP that has unicode characters in its name?。
答案 1 :(得分:2)
如果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字符串。