将windows-1251目录名转换为unicode(使用Python)

时间:2015-10-08 12:28:28

标签: php python unicode utf-8

我使用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))

2 个答案:

答案 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字符串。