Конвертировать имена каталогов windows-1251 в юникод (используя Python)

1

Я использовал 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))
  • 0
    используйте литерал Unicode: os.path.expanduser(ur"~\Desktop\1\save") , чтобы получить имена файлов Unicode.
Теги:
unicode
utf-8

2 ответа

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

Всегда используйте 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.

  • 0
    Почему я должен использовать тип Unicode для имен файлов, когда Windows использует Windows-1251?
  • 0
    @IvanPetrov: вы должны использовать тип Unicode, если вы работаете с текстом в Python. Имена файлов являются текстовыми в Windows (для них предусмотрен API Unicode). В данном случае это не имеет значения (все имена файлов по (недействительной) конструкции имеют символы в диапазоне cp1251), но в целом Unicode поддерживает около миллиона символов, в то время как cp1251 поддерживает только 256.
Показать ещё 2 комментария
2

Несколько вещей, чтобы уточнить:

  • UTF-8 - это кодировка, а не набор символов. Набор символов называется Unicode. - символ 128169 в этом наборе символов.

  • Строка ".txt" содержит 5 символов. Вы можете кодировать эти символы в байтах, используя кодировку UTF-8 или UTF-16. Компьютеры хранят байты, поэтому программа должна использовать один из этих кодировок, чтобы внутренне представлять эту строку.

  • Как следствие, нет такой вещи, как "переименование каталогов в набор символов Юникода". Имя файла .txt - это 5 символов, независимо от того, как операционная система хранит эти символы на диске.

Проблема заключается в самом PHP. В Windows PHP внутренне кодирует строки на локальной кодовой странице ANSI. Эта кодовая страница, вероятно, не может кодировать символ , поэтому PHP не может внутренне представлять эту строку. Как следствие, вы никогда не сможете получить доступ к файлу .txt в PHP. Единственным обходным решением является использование специального модуля для доступа к этим файлам. См. Как открыть файл на PHP, который имеет символы Unicode в своем имени? ,

  • 0
    Спасибо за разъяснение. Теперь я пытаюсь понять, что вещи с КП и кодировки. Также я вижу, что для правильного представления имен каталогов мне нужно преобразовать их в кодировку windows-1251. Я провел поиск и написал код для переименования моих каталогов с помощью python (сейчас я обновлю свой пост). Так что проблема наполовину решена. Единственное, мне интересно, как работает метод .decode ('utf-8'), потому что я не указал кодировку для преобразования.
  • 1
    Да, в PHP это, вероятно, правильно. Вы можете использовать Python для исправления имен файлов согласно ответу Себастьяна, но учтите, что эти файлы больше не будут доступны из PHP.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню