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 в двух байтах
  • € в трех
  • в четыре
Другие вопросы по тегам