fopen for all - это возможно ?

Раньше я программировал окна, но хочу попробовать свои силы в создании кроссплатформенного применение. И у меня есть несколько вопросов, если вы не возражаете:

Вопрос 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 ++.

24
задан Zero Piraeus 21 February 2015 в 20:16
поделиться