fwprintf не выводит широкие символы
Я хочу вывести широкие символы в файл, и fwprintf
не делает этого, даже если это описывается как только это. Образец кода:
const char *testFileName = "/Users/jdmuys/wideTestFile.txt";
FILE *wideTestFile;
wideTestFile = fopen(testFileName, "w");
fwide(wideTestFile, 1);
fwprintf(wideTestFile, L"12345");
fclose(wideTestFile);
После чего мой файл "wideTestFile.txt" содержит ровно 5 байтов: 31 32 33 34 35
согласно моей утилите шестнадцатеричного дампа.
Я подозреваю некоторую проблему с текущей локалью, как, возможно, fwprintf
призывает fwprintf_l
, который принимает локаль в качестве дополнительного аргумента.
Я читал о том, как использовать этот последний вызов, но не могу понять, что мне нужно передать в качестве локали. Документация довольно неясна по этому поводу (или, возможно, я этого не понимаю).
Любое объяснение почему fwprintf
не ведет себя так, как задокументировано? и любой пример использования для fwprintf_l
?
Большое спасибо,
JD
Это с Xcode 4.5.1 под Mac OS X 10.8.2 для iOS 6.0 из кода Objective-C. Но ничего из этого не должно иметь значения.
2 ответа
Ваш языковой стандарт, вероятно, является некоторым вариантом UTF-8, что означает, что вывод будет широким только при печати широких символов (т. Е. Символов вне кода ascii 0 - 127).
Если вы хотите использовать широкую печать (например, UTF-16LE), вам нужно использовать libiconv
, Этот ответ как бы иллюстрирует, почему он не имеет тенденцию делать то, что вы думаете, он делает.
Я собираюсь сделать предположение здесь.
Сохраняется в UTF-8. Теперь для большинства символов ASCII представление в ASCII и представление в UTF-8 абсолютно одинаковы. Теперь в UTF-8 верхние биты первого байта кодируют длину "символа". Например, все до 0x7F помещается в один байт (т. Е. Стандартный ASCII), 0x7FF в два байта и так далее. См. http://en.wikipedia.org/wiki/UTF-8 для получения более подробной информации.
Чтобы "исправить" вашу проблему, просто используйте символ сверху таблицы UTF-8.
Чтобы извлечь некоторые примеры из вышеупомянутой страницы Википедии:
- $ должен помещаться в один байт
- Two в двух байтах
- € в трех
- в четыре