Я использовал php-скрипт для создания каталогов, используя слова (категории), которые я выбрал с сайта (utf-8), но когда я создал эти каталоги, я вижу, что вместо реальных слов есть нечитаемые символы.
AFAIK PHP под Windows работает в локали cp1251
и не может работать с именами /dirnames 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))
Если 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
Всегда используйте Unicode для имен файлов в Windows.
Чтобы переименовать все .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.
Несколько вещей, чтобы уточнить:
UTF-8 - это кодировка, а не набор символов. Набор символов называется Unicode. - символ 128169 в этом наборе символов.
Строка ".txt"
содержит 5 символов. Вы можете кодировать эти символы в байтах, используя кодировку UTF-8 или UTF-16. Компьютеры хранят байты, поэтому программа должна использовать один из этих кодировок, чтобы внутренне представлять эту строку.
Как следствие, нет такой вещи, как "переименование каталогов в набор символов Юникода". Имя файла .txt
- это 5 символов, независимо от того, как операционная система хранит эти символы на диске.
Проблема заключается в самом PHP. В Windows PHP внутренне кодирует строки на локальной кодовой странице ANSI. Эта кодовая страница, вероятно, не может кодировать символ , поэтому PHP не может внутренне представлять эту строку. Как следствие, вы никогда не сможете получить доступ к файлу
.txt
в PHP. Единственным обходным решением является использование специального модуля для доступа к этим файлам. См. Как открыть файл на PHP, который имеет символы Unicode в своем имени? ,
os.path.expanduser(ur"~\Desktop\1\save")
, чтобы получить имена файлов Unicode.