Летом я написал класс для чтения файлов двоичного формата. Для максимальной переносимости использовалась исключительно стандартная библиотека. Напомню, что вся работа с двоичными файлами в C++ должна проводиться при помощи классов-потоков вроде fstream. Объект класс fstream инициализируется конструктором вида(как и все классы этой группы):
fstream (const char *s, int)
Здесь const char* - C-строка, где располагается адрес файла, второй аргумент - флаги, определяющие режим доступа к файлу. Это - именно определенная стандартом конструкция и, полагаю, очень часто используется в различных библиотеках.
Напомню также, что в NTFS для записи путей к файлам используется Unicode (UTF-16). UTF-16 для хранения информации о символе использует два байта и не совместима со стандартной ASCII.
В этот самый const char* никак не записать путь, состоящий из символов UTF-16, адрес надо указывать именно в однобайтных символах.
Забавно получается! Стандартная библиотека языка поддерживает чтение многобайтных кодировок из файла, но не гарантирует открытие названий файлов многобайтных кодировок вроде UTF-16 в NTFS; и открываемый под Windows адрес обязательно должен состоять из символов ASCII.
Пары байт Unicode пройти как последовательность символов в памяти не могут, потому что в них могут встретиться нулевые с точки зрения C-строк последовательности, закрывающие строку.
UTF-8 же можно передавать в таких строках. Дело в том, что последняя варьирует число используемых байт от одного до четырех, сохраняя при этом обратную совместимость с 7-битной таблицей символов ASCII; гарантируется, что ни один из байтов не будет представлять собой закрывающий C-строку нулевой байт.
Получилось, что файлы с русскими символами в пути под Линуксом открывались, а под Виндой - нет, хотя я использовал средства из стандартной библиотеки.
Для совместимости пришлось переделывать мой класс под использование файловых дескрипторов C, одинаково работающих и в современных Линуксах, и в Видоусах.