открытие файлов в не-ANSI системах через старые (не wchar) функции API - PullRequest
1 голос
/ 15 июня 2011

Я пишу какое-то промежуточное программное обеспечение, которое сводит меня с ума. Я ищу экспертов I18N, чтобы помочь мне - это все довольно ново для меня.

Сейчас это все в Windows, но оно должно работать и на Linux, и на Mac, хотя, держу пари, это будет легко.

У меня есть система (которую я не могу потрогать), которая выдаст мне строку в виде wchar_t *. Он принимает входные данные либо в UTF-8, либо в текущей локали и делает магию, чтобы дать мне wchar_t *.

У меня есть другой API, который я использую, который может принимать имена файлов только как символы * (которых я тоже не могу коснуться).

Итак, я взял мое имя файла в wchar_t * и использовал функцию Windows API WideCharToMultiByte, преобразовал его в символ * и передал его в мою другую функцию API. Это работало очень хорошо, пока QA не решил использовать японскую ОС. Теперь fopen (глубоко внутри API, которого я не могу коснуться) не работает.

Я пытался использовать как CP_ACP, так и CP_UTF8 в моем вызове WideCharToMultiByte, и оба работают на моей машине разработки (США-английский) даже с японскими символами в имени файла. Но оба терпят неудачу на японской ОС.

Любые подсказки о том, как я должен действительно обрабатывать эти имена файлов?

1 Ответ

5 голосов
/ 15 июня 2011

Ну, правильный способ исправить это - исправить другой API.Принятие только узких, не-unicode имен файлов - просто нарушенное поведение.

Но ... вы сказали, что не можете этого сделать.Возможно, вы сможете обойти это, получив короткое имя файла, в котором не будет символов, отличных от ANSI, и передав его вместо сломанного API.(Причина этого заключается в том, что короткие имена файлов предназначены для работы с 16-битными приложениями, а 16-битные окна вообще не поддерживают Юникод)

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

EDIT : еще одно примечание - если имя файла содержит Unicodeкороткое имя файла, как правило, не будет читаемым человеком.Он будет переименован для использования набора шестнадцатеричного мусора, который однозначно идентифицирует файл в мире, ограниченном 8,3 именами файлов.

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