Как я могу преобразовать путь Unicode в строку c? - PullRequest
9 голосов
/ 01 июня 2010

Как я могу преобразовать из имени пути Unicode (LPWSTR) в эквивалент ASCII? Библиотека, которая вызывается, понимает только строки c.

Edit: Хорошо, я взял предложения GetShortPathName и WideCharToMultiByte и создал этот кусок кода, я протестировал его с некоторыми папками, содержащими символы Unicode в пути, и он работал без нареканий:

wlength = GetShortPathNameW(cpy,0,0);
LPWSTR shortp = (LPWSTR)calloc(wlength,sizeof(WCHAR));
GetShortPathNameW(cpy,shortp,wlength);
clength = WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, 0, 0, 0, 0);
LPSTR cpath = (LPSTR)calloc(clength,sizeof(CHAR));
WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, cpath, clength, 0, 0);

1 Ответ

5 голосов
/ 01 июня 2010

GetShortPathName() Функция

http://msdn.microsoft.com/en-us/library/aa364989%28VS.85%29.aspx

Предоставит вам эквивалентное имя файла 8.3, указывающее на тот же файл, для использования с устаревшим кодом.

[EDIT] Это, вероятно, лучшее, что вы можете сделать, хотя теоретически имена файлов 8.3 могут содержать символы не ascii, в зависимости от настроек реестра. В этом случае у вас нет простого способа получить правильный char *, и GetShortPathNameA () также не будет этого делать, если настройки кодовой страницы во время создания файла не соответствуют текущим настройкам.

См. http://technet.microsoft.com/en-us/library/cc781607%28WS.10%29.aspx о настройке. Здесь есть консенсус (см. Ниже), которым разумно пренебречь.

Спасибо, Морон, Всем, за вклад в это сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...