Почему делает следующее, происходите:
>>> 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 (). В этом случае это не будет работать
В документации для sys.getfilesystemencoding () говорится, что для Windows NT и более поздних версий имена файлов изначально имеют Unicode. Если у вас есть допустимое имя файла в формате Unicode, зачем вам кодировать его с помощью mbcs?
В документации для модуля кодеков говорится, что mbcs кодирует с использованием «кодовой страницы ANSI» (которая будет отличаться в зависимости от локали пользователя), поэтому, если locale не использует кириллические символы, splat.
Изменить: Итак, ваш процесс вызывает subprocess.Popen (). Если вызванный процесс находится под вашим контролем, оба процесса должны иметь возможность согласиться на использование UTF-8 в качестве транспортного формата Unicode. В противном случае вам может потребоваться задать вопрос в списке рассылки pywin32. В любом случае отредактируйте свой вопрос, указав степень вашего контроля над запущенным процессом.
Если вам нужно передать имя существующего файла, то у вас больше шансов на успех, если вы передадите 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 во внешнюю команду и удалить их после этого.
.