Раньше я программировал окна, но хочу попробовать свои силы в создании кроссплатформенного применение. И у меня есть несколько вопросов, если вы не возражаете:
Вопрос 1
Есть ли способ открыть файл UNICODE \ ASCII и автоматически определить его кодировку с использованием чистого ANSI C. MSDN сообщает, что fopen () может переключаться между различные форматы UNICODE (utf-8, utf-16, UNICODE BI \ LI), если я буду использовать флаг "ccs = UNICODE". Экспериментально было обнаружено, что переключения с UNICODE на ASCII не происходит, но, пытаясь решить эту проблему, я обнаружил, что текстовые файлы Unicode имеют некоторые префиксы, такие как 0xFFFE, 0xFEFF или 0xFEBB.
FILE *file;
{
__int16 isUni;
file = _tfopen(filename, _T("rb"));
fread(&(isUni),1,2,file);
fclose(file);
if( isUni == (__int16)0xFFFE || isUni == (__int16)0xFEFF || isUni == (__int16)0xFEBB)
file = _tfopen(filename, _T("r,ccs=UNICODE"));
else
file = _tfopen(filename, _T("r"));
}
Итак, могу ли я сделать что-то вроде этого кроссплатформенный и не такой уж уродливый?
Вопрос 2
Я могу сделать что-то подобное в Windows, но будет ли это работать в Linux?
file = fopen(filename, "r");
fwscanf(file,"%lf",buffer);
Если нет, то есть ли какая-то функция ANSI C для преобразования ASCII строки в Unicode? Я хочу работать со строками Unicode в своей программе.
Вопрос 3
Кроме того, мне нужно выводить строки Unicode в консоль. В Windows есть setlocale (*), но что мне делать в Linux? Кажется, что консоль там уже поддерживает Unicode.
Вопрос 4
Вообще говоря, я хочу работать с Unicode в своей программе, но столкнулся с некоторыми странными проблемами:
f = fopen("inc.txt","rt");
fwprintf(f,L"Текст"); // converted successfully
fclose(f);
f = fopen("inc_u8.txt","rt, ccs = UNICODE");
fprintf(f,"text"); // failed to convert
fclose(f);
P.S. Есть ли какая-нибудь хорошая книга о кроссплатформенном программировании, что-нибудь о сравнении кода программ Windows и Linux? И еще какая-то книга о способах использования Unicode, практических методах. Я не хочу погружаться в простую историю UNICODE BI \ LI, меня интересуют конкретные библиотеки C / C ++.