Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Как отобразить русский текст?

#windows #сокет #cpp


Перехватываю пакет, и там иногда бывает текст на английском, а иногда - на русском.
С английским проблем нету, отображается хорошо, а вот что с русским делать? 

Как узнать русский или английский текст и как потом отобразить русский?
    


Ответы

Ответ 1



Необходимо знать кодировку текста, например, она может быть указана в Content-Type http-заголовке и/или в xml-декларации и/или как внутри html-документа и т.д. Если данные из файла, то некоторые кодировки (utf-8, utf-16, utf-32) позволяют указывать BOM (специальная метка в начале файла). В худшем случае, существуют библиотеки такие как chardet, которые пытаются угадать кодировку по содержимому (это не всегда можно точно сделать). Нельзя содержимое называть текстом, если не известна его кодировка. Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов Обновление Если кодировка текста известна, то шаг номер два: превратить байты в Юникодный текст. Для некоторых кодировок можно использовать MultiByteToWideChar(). Шаг номер три: отобразить Юникод. Для печати в консоль, можно использовать WriteConsoleW() или _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"%s\n", unicode_text); (printf, cout, wcout не должны использоваться в последнем варианте). Чтобы буквы были видны в консоли, нужно создать ярлык для приложения и настроить в нём шрифт (например, Lucida console) и запускать программу через ярлык. При печати в файл (и type) можно BOM добавить. Вот полный пример кода из msdn как напечатать Юникод текст в Виндовую консоль с cmd.exe: #include #include #include int main(void) { _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); return 0; } Повторюсь: это решение не совместимо с printf(). Не нужно вызывать SetConsoleCP или SetConsoleOutputCP c вышеприведённым кодом. Единственное что нужно, чтобы (TrueType) шрифт был настроен в консоле (такой как Lucida Console).

Ответ 2



Как узнать русский или английский текст и как потом отобразить русский? Русские (точнее, нелатинские) символы всегда будут кодироваться одни байтом со значением > 127 в однобайтовой кодировке и секвенцией, начинающейся с байта со значением > 127 в utf-8 (подробнее в вики). В целом задача сводится к определению кодировки, и если определить utf-8/utf-16/utf-32 еще представляется возможным вручную, то с остальным зоопарком требуется сидеть со стат анализом и подбирать наиболее подходящую кодировку.

Комментариев нет:

Отправить комментарий