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

Как правильно выводить строки UTF-8 в `std::cout` в Windows?

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

How to Output UTF-8 Strings Correctly to `std::cout` on Windows?

Работа со строками UTF-8 в C в Windows

Кодирование строк в формате UTF-8 широко используется для кроссплатформенных приложений. Однако вывод строк UTF-8 в std::cout в Windows представляет собой уникальные проблемы.

По умолчанию в Windows std::cout ожидает строки в форматах, отличных от Unicode. При представлении строк UTF-8 отображаются поврежденные символы.

Для решения этой проблемы необходимо выполнить два основных шага:

  1. Установить кодовую страницу консоли в UTF-8. : Используя функцию SetConsoleOutputCP, сообщите консоли, что входящий поток байтов имеет кодировку UTF-8.
  2. Включить буферизацию потока: Отключить поведение std::basic_filebuf по умолчанию в Visual Studio, которая разбивает последовательности байтов UTF-8 и передает их как отдельные байты. Чтобы преодолеть эту проблему, setvbuf включает буферизацию потока, гарантируя, что вся строка будет передана целиком.

Вот исправленный фрагмент кода, который включает эти решения:

#include 
#include 
#include 
#include 

int main() {
    // Set console code page to UTF-8
    SetConsoleOutputCP(CP_UTF8);

    // Enable buffering to prevent byte-by-byte transmission
    setvbuf(stdout, nullptr, _IOFBF, 1000);

    // Output UTF-8 string
    std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
    std::cout 

В дополнение к этим шагам обратите внимание, что растровые шрифты в консоли Windows могут неправильно отображать символы Юникода, отличные от ASCII. Чтобы обеспечить правильную отрисовку, рекомендуется переключиться на шрифт TrueType, который теперь используется по умолчанию в Windows 10 и более поздних версиях.

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

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

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

Copyright© 2022 湘ICP备2022001581号-3