Страницы

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

четверг, 6 июня 2019 г.

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

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


Ответ

Необходимо знать кодировку текста, например, она может быть указана в Content-Type http-заголовке и/или в xml-декларации и/или как внутри html-документа и т.д. Если данные из файла, то некоторые кодировки (utf-8, utf-16, utf-32) позволяют указывать BOM (специальная метка в начале файла). В худшем случае, существуют библиотеки такие как chardet, которые пытаются угадать кодировку по содержимому (это не всегда можно точно сделать).
Нельзя содержимое называть текстом, если не известна его кодировка. Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов
Обновление
Если кодировка текста известна, то шаг номер два: превратить байты в Юникодный текст. Для некоторых кодировок можно использовать MultiByteToWideChar(). Шаг номер три: отобразить Юникод. Для печати в консоль, можно использовать WriteConsoleW() или _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"%s
", 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
"); return 0; }
Повторюсь: это решение не совместимо с printf(). Не нужно вызывать SetConsoleCP или SetConsoleOutputCP c вышеприведённым кодом. Единственное что нужно, чтобы (TrueType) шрифт был настроен в консоле (такой как Lucida Console).

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

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