Клиент жалуется, что наш код используется для записи файлов с японскими символами в имени файла, но больше не работает во всех случаях. Мы всегда просто использовали старые добрые строки char * для представления имен файлов, поэтому для меня стало шоком то, что это сработало, и мы не сделали ничего, что, как мне известно, могло бы заставить его перестать работать. Я попросил их отправить мне файл со встроенным именем файла, экспортированным из нашего программного обеспечения, и похоже, что строки используют шестнадцатеричные символы 82 и 83 в качестве первого символа двухбайтовой последовательности для представления японских символов. Работа в Интернете заставляет меня поверить, что это, вероятно, SHIFT_JIS и / или кодовая страница Windows 932.
Мне кажется, что то, что происходит, ранее было и fopen, и ofstream :: открытое имя файла с использованием этой кодовой страницы; сейчас только 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 ++. код.