как подчинить библиотеку, чтоб работала с юникодом или, хотя бы, с локалью?
От: Кодт Россия  
Дата: 20.06.14 12:56
Оценка:
Задача вот какая.
Есть кроссплатформенный проект (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() примет?


К сожалению, яндекс и гугл завален "детскими вопросами" — как выводить всякие кодировки на экран, или как побороть пэхапэ. Поэтому буду благодарен за точную наводку.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.