Вопрос
Похоже, 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 до исправления.