Клиент жалуется, что наш код использовался для записи файлов с японскими символами в имени файла, но теперь работает не во всех случаях. Мы всегда просто использовали старые добрые строки char * для представления имен файлов, поэтому меня немного шокировало, что это когда-либо работало, и мы не сделали ничего, о чем я знаю, что должно было бы заставить его перестать работать. Я попросил их прислать мне файл со встроенным именем файла, экспортированным из нашего программного обеспечения, и похоже, что в строках используются шестнадцатеричные символы 82 и 83 в качестве первого символа двухбайтовой последовательности для представления японских символов. Поиск в Интернете приводит меня к мысли, что это, вероятно, SHIFT_JIS и/или кодовая страница Windows 932.
Мне кажется, что то, что происходит, ранее было как fopen, так и ofstream::open принятыми именами файлов с использованием этой кодовой страницы; теперь только fopen делает. Я проверил документы Visual Studio fopen и не вижу намека на то, что делает приемлемую строку для передачи в fopen.
В краткосрочной перспективе я надеюсь, что кто-то сможет пролить свет на конкретную проблему Windows fopen и ofstream::open для меня. В конечном счете, мне бы очень хотелось узнать общепринятый способ открытия имен файлов Unicode (и других?) в C++, в Windows, Linux и OS X.
Отредактировано для добавления: я считаю, что открытия, которые работают, выполняются в локали «C», тогда как те, которые не работают, выполняются в любой локали клиента по умолчанию. Однако так было уже много лет, и старая версия программы до сих пор работает в их системе, так что это кажется далеким объяснением проблемы, которую мы наблюдаем.
Обновление: я отправил заказчику небольшую тестовую программу. Было подтверждено, что fopen нормально работает с именем файла SHIFT_JIS, а std::ofstream — нет. Это происходит в Visual Studio 2005 и происходит независимо от того, использовал ли я локаль по умолчанию или локаль «C».
Мне все еще интересно, есть ли у кого-нибудь объяснение этому поведению (и почему оно таинственным образом изменилось - возможно, пакет обновлений VS2005?) и надеюсь собрать исчерпывающий "лучший опыт" для обработки имен файлов Unicode в переносимом коде C++.