Как обрабатывать строки Unicode Python с нулевыми байтами в качестве «правильных» способ?

Вопрос

Похоже, PyWin32 удобен в использовании строк Unicode с завершающим нулем в качестве возвращаемых значений. Я хотел бы «правильно» обращаться с этими строками.

Допустим, я получаю строку вроде: u'C: \\ Users \\ Guest \\ MyFile.asy \ x00 \ x00sy ' . Это похоже на строку в стиле C с завершающим нулем, которая находится в объекте Unicode Python. Я хочу обрезать этого плохого парня до обычной старой строки символов, которую я мог бы, например, отобразить в строке заголовка окна.

Обрезает строку на первом нулевом байте - правильный способ справиться с этим ?

Я не Я не ожидаю получить такое возвращаемое значение, поэтому мне интересно, упускаю ли я что-то важное о том, как Python, Win32 и unicode работают вместе ... или это просто ошибка PyWin32.

Общие сведения

I Я использую функцию выбора файлов Win32 GetOpenFileNameW из пакета PyWin32. Согласно документации, эта функция возвращает кортеж, содержащий полный путь к имени файла в виде объекта Unicode Python.

Когда я открываю диалог с существующим путем и установленным именем файла, я получаю странное возвращаемое значение.

Например, у меня было значение по умолчанию: C: \ Users \ Guest \ MyFileIsReallyReallyReallyAwesome.asy

В диалоговом окне я изменил имя на MyFile.asy и нажал save.

Полный путь возвращаемого значения был: u'C: \ Users \ Guest \ MyFile.asy \ x00wesome.asy ''

Я ожидал, что это будет: u'C: \\ Users \\ Guest \\ MyFile.asy '

Функция возвращает переработанный буфер без обрезки завершающих байтов. Излишне говорить, что остальная часть моего кода не была настроена для обработки строки с завершающим нулем в стиле C.

Демо-код

Следующий код демонстрирует строку с завершающим нулем в возвращаемом значении из GetSaveFileNameW.

Инструкции: в диалоговом окне измените имя файла на «MyFile.asy», затем нажмите «Сохранить». Наблюдайте за тем, что печатается на консоли. В результате я получаю u'C: \ Users \ Guest \ MyFile.asy \ x00wesome.asy '.

import win32gui, win32con

if __name__ == "__main__":
    initial_dir = 'C:\\Users\\Guest'
    initial_file = 'MyFileIsReallyReallyReallyAwesome.asy'
    filter_string = 'All Files\0*.*\0'
    (filename, customfilter, flags) = \
        win32gui.GetSaveFileNameW(InitialDir=initial_dir,
                    Flags=win32con.OFN_EXPLORER, File=initial_file,
                    DefExt='txt', Title="Save As", Filter=filter_string,
                    FilterIndex=0)
    print repr(filename)

Примечание. Если вы недостаточно сократите имя файла (например, если вы попробуете MyFileIsReally.asy) строка будет завершена без нулевого байта.

Environment

Windows 7 Professional 64-бит (без пакета обновления), Python 2.7.1, PyWin32 Build 216

ОБНОВЛЕНИЕ: PyWin32 Tracker Artifact

Судя по комментариям и ответам, которые я получил до сих пор, это, скорее всего, ошибка pywin32, поэтому я отправил артефакт трекера .

ОБНОВЛЕНИЕ 2: Исправлено!

Марк Хаммонд сообщил в артефакте трекера, что это действительно ошибка. Было зарегистрировано исправление для rev f3fdaae5e93d, так что, надеюсь, оно будет сделано в следующем выпуске.

Я думаю, что приведенный ниже ответ Алекси Торхамо - лучшее решение для версий PyWin32 до исправления.

10
задан Steven T. Snyder 3 May 2011 в 22:09
поделиться