Я создал один текстовый файл с кодировкой UTF-8, и в этом файле я написал несколько японских символов, теперь я хочу прочитать этот текстовый файл и отобразить его на консоли, а также сохранить данные в другом файле.
Microsoft SDK предоставляет две функции для преобразования между кодировками символов: MultiByteToWideChar [^] и WideCharToMultiByte [^].
Чтобы упростить код вашего приложения, вы должны использовать Unicode (который по умолчанию с последними версиями VisualStudio).
Используйте MultiByteToWideChar
для преобразования строки UTF-8 в широкие символы. Чтобы распечатать это на консоли, может потребоваться преобразовать строку в кодировку, используемую консолью (вызовите GetConsoleOutputCP [^]). Если кодовая страница, используемая консолью, не может печатать ваши японские символы, вы можете изменить кодовую страницу с помощью SetConsoleOutputCP [^]. Во всех случаях вы должны убедиться, что шрифт, используемый консолью, содержит используемые символы.
При выводе в файл вы можете использовать любую кодировку. Это в основном зависит от приложений, которые должны открывать файл.
[ИЗМЕНИТЬ в соответствии с комментарием, опубликованным выше]
Вы можете ознакомиться с советом Обработка простых текстовых файлов в C /C ++ [^] для примера.
Общий процесс следующий:
- Получить размер файла UTF-8
- Выделить буфер для текста UTF-8
- Открыть файл, прочитать содержимое в буфер, закрыть файл
- Вызов
MultiByteToWideChar
сCP_UTF8
,lpMultiByteStr
= входной буфер,cbMultiByte
= размер файла,lpWideCharStr
= NULL,cchWideChar
== 0, чтобы получить длину буфера. - Выделить широкий буфер символов, используя возвращенное значение с помощью вышеуказанного вызова
- Вызов
MultiByteToWideChar
снова, передав теперь выходной буфер и его размер. - Сделайте что-нибудь с широкой строкой, например печать на консоль
- Удалите буферы, если они больше не нужны
Если вы хотите использовать содержимое файла UTF-8 также для других целей, вы должны выделить на один байт больше и установить его равным нулю. В этом нет необходимости, если используется только MultiByteToWideChar
и передается правильный размер.