Я портировал код с C на C++ и только что нашел проблему с путями, которые содержат em-dash, например. "C: \ Temp \ тест-1.dgn". Вызов функции fstream :: open() завершится неудачно, хотя путь корректно отобразится в отладчике Visual Studio 2005.Почему не поддерживает поддержку em-тире в имени файла?
Странно, что старый код, который использовал функцию f fen() библиотеки C, отлично работает. Я подумал, что вместо этого попробую удачу с классом wfstream, а затем обнаружил, что преобразование моей строки C с использованием mbstowcs() полностью утрачивает em-dash, что означает, что он также терпит неудачу.
Я предполагаю, что это проблема локали, но почему не поддерживается em-dash в локали по умолчанию? И почему нельзя управлять потоком em-dash? Я бы подумал, что любой байт-символ, поддерживаемый файловой системой Windows, будет поддерживаться классами потоков файлов.
Учитывая эти ограничения, каков правильный способ обработки открытия потока файлов, который может содержать допустимые имена файлов Windows, которые не просто попадают на определенные символы?
Прежде всего вам нужно уточнить, в каких байтах содержится ваше имя файла. Передача emdash (0x2014) в fopen будет технически работать с некоторым кастингом или разбивать его на два байта или что-то еще, но после этого он не будет emdash. Используйте, например. FindFirstFileW/FindNextFileW и т. Д., А затем посмотрите на необработанные байтовые значения. – deviantfan
Извините, должен был уточнить, что у меня просто есть простая старая строчная строка стиля C, а не UTF8. Em-dash представляется как один байт - 0x97, который должен быть стандартным 8-битным символом ANSI. – Piers