Имена файлов Unicode на Windows с Питоном & подпроцессом. Popen ()

Почему делает следующее, происходите:

>>> u'\u0308'.encode('mbcs')   #UMLAUT
'\xa8'
>>> u'\u041A'.encode('mbcs')   #CYRILLIC CAPITAL LETTER KA
'?'
>>>

У меня есть заявление Пайтона, принимающее имена файлов от операционной системы. Это работает на некоторых международных пользователей, но не других.

Например, это unicode имя файла: u '\u041a\u0433\u044b\u044b\u0448\u0444\u0442'

не закодирует с Windows 'mbcs' кодирующий (тот, используемый файловой системой, возвращенной sys.getfilesystemencoding ()). Я добираюсь'???????', указание на кодирующее устройство терпит неудачу на тех знаках. Но это не имеет никакого смысла, так как имя файла прибыло от пользователя для начала.

Обновление: вот предпосылки к моим причинам этого... У меня есть файл на моей системе с именем в кириллице. Я хочу назвать подпроцесс. Popen () с тем файлом как аргумент. Popen не будет обращаться с unicode. Обычно мне может сойти с рук кодирование спора с кодер-декодером, данным sys.getfilesystemencoding (). В этом случае это не будет работать

12
задан Norman 17 December 2009 в 20:15
поделиться

2 ответа

В документации для sys.getfilesystemencoding () говорится, что для Windows NT и более поздних версий имена файлов изначально имеют Unicode. Если у вас есть допустимое имя файла в формате Unicode, зачем вам кодировать его с помощью mbcs?

В документации для модуля кодеков говорится, что mbcs кодирует с использованием «кодовой страницы ANSI» (которая будет отличаться в зависимости от локали пользователя), поэтому, если locale не использует кириллические символы, splat.

Изменить: Итак, ваш процесс вызывает subprocess.Popen (). Если вызванный процесс находится под вашим контролем, оба процесса должны иметь возможность согласиться на использование UTF-8 в качестве транспортного формата Unicode. В противном случае вам может потребоваться задать вопрос в списке рассылки pywin32. В любом случае отредактируйте свой вопрос, указав степень вашего контроля над запущенным процессом.

3
ответ дан 2 December 2019 в 19:31
поделиться

Если вам нужно передать имя существующего файла, то у вас больше шансов на успех, если вы передадите 8.3 версию имени файла в Unicode.

У вас должен быть установлен пакет pywin32, то вы можете сделать:

>>> import win32api
>>> win32api.GetShortPathName(u"C:\\Program Files")
'C:\\PROGRA~1'

Я считаю, что эти короткие имена файлов используют только ASCII символы, и поэтому вы должны быть в состоянии использовать их в качестве аргументов в командной строке.

Если вам нужно указать также и создаваемые имена файлов, вы можете заранее создать их с нулевым размером на Python, используя имена файлов в Unicode, и передать короткое имя файла в качестве аргумента.

UPDATE: user bogdan правильно говорит, что генерацию 8.3-ого имени файла можно отключить (у меня тоже отключили, когда у меня на ноутбуке была Windows XP), так что вы не можете на них полагаться. Итак, как еще один более надуманный подход при работе с томами NTFS, можно жестко связать имена файлов Unicode с обычными ASCII; передать имена файлов ASCII во внешнюю команду и удалить их после этого.

.
2
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: