Задача вот какая.
Есть кроссплатформенный проект (windows, linux), пользующийся некоторыми сторонними библиотеками.
В том числе, эти библиотеки принимают char* имена файлов, чтобы внутри себя их прочесть-записать.
Нужно как-то изловчиться, чтобы они могли работать с именами за пределами системной локали.
Например, у меня русские винды, кодировка 1251 и 866.
Беру файл с умляутами (1252), — в эксплорере он виден, в коммандкоме тоже.
fopen() обламывается.
Конечно, в виндах есть std::ifstream с конструктором (wchar_t*), а кроссплатформенно есть boost::ifstream (под виндами работает с utf-16, под никсами — с utf-8).
Но это если я на своей стороне делаю. А мне надо, чтобы сторонняя библиотека тоже смогла.
Было бы идеально взять имя в utf-8 и передать. Но библиотека же не подозревает об этом, — значит, придётся через setlocale.
И тут засада: в виндах setlocale не знает про utf-8, ни так ".utf-8", ни так "utf-8", ни даже так ".65001".
Есть какой-нибудь способ навязать utf-8 сишному рантайму? Пусть даже windows-specific?
Ладно, допустим, я ограничусь работой только с файлами, чьи имена нормально представляются в системной кодировке.
Но вот существуют модификации кодировок: 1251 русская, казахская и чувашская, 1254 турецкая и азербайджанская.
Беру, скажем, конфиг (в utf-8 или utf-16), перевожу в дефолтную кодировку штатными средствами, — имя правильно отобразится, или нет? Как он отличит, это 1254-t или 1254-a?
А потом полученную строку fopen() примет?
К сожалению, яндекс и гугл завален "детскими вопросами" — как выводить всякие кодировки на экран, или как побороть пэхапэ. Поэтому буду благодарен за точную наводку.