Записать wchar_t * в файл - работает только для некоторых символов

У меня есть методы, которые возвращают тексты в Юникоде, и мне нужно записать их в файл, но некоторые символы не записаны. Имею следующее:

const wchar_t* getStandardText() {
    return L"test";
}

const wchar_t* getUnicodeText()
{
    return L"testíček";
}

int main()
{
    FILE *file = fopen(FILE_NAME, "a");

    fputws(getStandardText(), file);
    fputws(getUnicodeText(), file);

    fclose(file);
}

Вывод в файл:

testtestí

Меня гораздо больше сбивает с толку то, что некоторые символы, такие как «í», работают, а другие, например, «č» - нет.

  • Я использую Windows с VS 2015 Pro.
  • Для чтения файла я использую Notepad ++, который сообщает мне, что файл имеет кодировку ANSI.

Название вашей функции getASCII вводит в заблуждение. Кроме того, в какой системе вы запускаете эту программу? А как проверить содержимое файла?

Some programmer dude 10.09.2018 10:42

В какой кодировке используется ваш исходный код и как вы его компилируете?

melpomene 10.09.2018 10:47

Файл представляет собой последовательность байты. То, как эти байты интерпретируются как символы, может варьироваться. Поэтому, если вы не можете сказать, как вы проверяете вывод вашего файла, невозможно ответить на ваш вопрос. Вопросы о международных персонажах очень сложны, потому что большинство новичков не знают, как задать правильный вопрос. Они просто ожидают, что персонажи будут работать, но это не так просто.

john 10.09.2018 10:54

Я добавил дополнительную информацию в вопрос, спасибо.

Erik Šťastný 10.09.2018 10:56

Возможно вам понадобятся настройки ccs. См. Документы Microsoft здесь: docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/…

Hitobat 10.09.2018 10:57

«ANSI» - это не кодировка. (Я знаю, что Windows любит утверждать обратное, но это неправильно.)

melpomene 10.09.2018 10:58
"... что говорит мне, что файл имеет кодировку ANSI ..." Если файл не имеет спецификации, Блокнот должен угадать кодировку, используя комбинацию эвристик; это подвержено ошибкам. Просмотрите файл в шестнадцатеричном редакторе, чтобы увидеть фактически записанные байты.
Richard Critten 10.09.2018 11:00

«í» является частью ASCII, а «č» - нет. Это, вероятно, объясняет, почему это работает. asciitable.com

vll 10.09.2018 11:01

@RichardCritten Notepad ++ - это не Блокнот. Notepad ++ делает более умную проверку содержимого файла (но, конечно, не безошибочно)

john 10.09.2018 11:03
2
9
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это работает в Windows ... Измените параметр mode, чтобы иметь явную кодировку ...

FILE *file = fopen("foobar.txt", "a+, ccs=UTF-16LE");

ИЛИ

FILE *file = fopen("foobar.txt", "a+, ccs=UTF-8");

Похоже, что это заставляет метки порядка байтов (FF FE) в заголовке файла указывать, что текст файла является Unicode.

Файл должен быть создан с соответствующей спецификацией. Ниже приведен наиболее предпочтительный способ и убедитесь, что вы сбрасываете в файл только символы UTF-8. И откройте через блокнот ++, чтобы просмотреть его.

FILE *file = fopen("test.txt", "a+, ccs=UTF-8");

Другие вопросы по теме