«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как правильно напечатать символ UTF-8 в консоли Windows с немецкими символами?

Как правильно напечатать символ UTF-8 в консоли Windows с немецкими символами?

Опубликовано 9 ноября 2024 г.
Просматривать:141

How to Print UTF-8 Character Correctly in Windows Console with German Characters?

Правильная печать символов UTF-8 в консоли Windows

Эта статья призвана решить проблемы, возникающие при попытке напечатать символы UTF-8 в консоль Windows.

Описание проблемы

Пользователи столкнулись с трудностями при отображении немецких символов с помощью определенного фрагмента кода:

#include 
#include 

int main() {
  SetConsoleOutputCP(CP_UTF8);
  // German characters not appearing
  char const* text = "aäbcdefghijklmnoöpqrsßtuüvwxyz";
  int len = MultiByteToWideChar(CP_UTF8, 0, text, -1, 0, 0);
  wchar_t *unicode_text = new wchar_t[len];
  MultiByteToWideChar(CP_UTF8, 0, text, -1, unicode_text, len);
  wprintf(L"%s", unicode_text);
}

Несмотря на установку выходной кодовой страницы UTF-8, немецкие символы печатаются неправильно.

Решение

Чтобы правильно распечатать данные Unicode в Консоль Windows, существует несколько доступных методов:

  1. Непосредственное использование WriteConsoleW: Взаимодействие с консольным API напрямую с помощью WriteConsoleW. Такой подход гарантирует правильную запись данных в консоль. Однако для этого необходимо различать консольные и неконсольные ситуации вывода.
  2. Настройка режима вывода: Установите режим вывода стандартных дескрипторов выходных файлов на «_O_U16TEXT» или «_O_U8TEXT» с помощью _setmode. Это позволяет функциям вывода широких символов правильно выводить данные Unicode на консоль. Обратите внимание, что этот метод требует использования только функций расширенных символов в выбранном потоке.
  3. Кодировка CP_UTF8: Распечатайте текст UTF-8 непосредственно на консоль, установив для выходной кодовой страницы консоли значение CP_UTF8 и используя соответствующую низкоуровневые функции или пользовательская реализация ostream.

Устранение неполадок

В случае неправильного вывода с помощью третьего метода:

putc('\302'); putc('\260'); // doesn't work with CP_UTF8

puts("\302\260"); // correctly writes UTF-8 data to Windows console with CP_UTF8 

Это связано с тем, что консольный API интерпретирует данные, передаваемые в отдельных вызовах, как недопустимые кодировки при использовании CP_UTF8.

Чтобы решить эту проблему, рассмотрите возможность создания подклассstreambuf, который точно обрабатывает преобразование многобайтовых символов и поддерживает состояние преобразования между операциями записи.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3