Unicode Hello World на китайском языке
Вот привет, мир на китайском языке. На самом деле это просто «Привет». Я тестировал это в Windows 10, но думаю, что он может работать с Windows Vista. До Windows Vista это будет сложно, если вам нужно программное решение вместо настройки консоли / реестра и т. Д. Возможно, посмотрите здесь, если вам действительно нужно сделать это в Windows 7: Изменить шрифт консоли Windows 7
Я не хочу утверждать, что это единственное решение, но именно оно сработало для меня.
Контур
- Настройка проекта Unicode
- Установите кодовую страницу консоли в Unicode
- Найдите и используйте шрифт, поддерживающий символы, которые вы хотите отобразить.
- Используйте локаль языка, который вы хотите отображать
- Используйте вывод широких символов, т.е.
std::wcout
1 Настройка проекта
Я использую Visual Studio 2017 CE. Я создал пустое консольное приложение. Настройки по умолчанию в порядке. Но если у вас возникнут проблемы или вы используете другой ide, вы можете проверить это:
В свойствах вашего проекта найдите свойства конфигурации -> Общие -> Значения по умолчанию для проекта -> Набор символов. Это должно быть «Использовать набор символов Юникода», а не «Многобайтовый». Это определит для вас макросы препроцессора _UNICODE
и UNICODE
.
int wmain(int argc, wchar_t* argv[])
Также я думаю, что мы должны использовать функцию wmain
вместо main
. Они оба работают, но в среде юникода wmain
может быть более удобным.
Также мои исходные файлы имеют кодировку UTF-16-LE, которая, по-видимому, используется по умолчанию в Visual Studio 2017.
2. Кодовая страница консоли
Это совершенно очевидно. Нам нужна кодовая страница юникода в консоли. Если вы хотите проверить кодовую страницу по умолчанию, просто откройте консоль и введите chcp
без каких-либо аргументов. Мы должны изменить его на 65001, что является кодовой страницей UTF-8. Идентификаторы кодовой страницы Windows Там - макрос препроцессора для этой кодовой страницы: CP_UTF8
. Мне нужно было установить кодовую страницу ввода и вывода. Когда я пропустил любой из них, результат был неправильным.
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
Вы также можете проверить логические возвращаемые значения этих функций.
3. Выберите шрифт.
До сих пор я не нашел консольного шрифта, поддерживающего все символы. Так что мне пришлось выбрать один. Если вы хотите выводить символы, которые частично доступны только в одном шрифте, а частично в другом, то я считаю, что решение найти невозможно. Только возможно, если есть шрифт, поддерживающий каждый символ. Но также я не разбирался в том, как установить шрифт.
Я думаю, что невозможно одновременно использовать два разных шрифта в одном окне консоли.
Как найти совместимый шрифт? Откройте консоль, перейдите в свойства окна консоли, щелкнув значок в левом верхнем углу окна. Перейдите на вкладку шрифтов, выберите шрифт и нажмите ОК. Затем попробуйте ввести своих персонажей в окно консоли. Повторяйте это, пока не найдете шрифт, с которым сможете работать. Затем запишите название шрифта.
Также вы можете изменить размер шрифта в окне свойств. Если вы нашли подходящий размер, запишите значения размеров, которые отображаются в окне свойств в разделе «выбранный шрифт». Он покажет ширину и высоту в пикселях.
Чтобы программно установить шрифт, вы используете:
CONSOLE_FONT_INFOEX fontInfo;
// ... configure fontInfo
SetCurrentConsoleFontEx(hConsole, false, &fontInfo);
См. Подробности в моем примере в конце этого ответа. Или поищите его в прекрасном руководстве: SetCurrentConsoleFont. Эта функция существует только с Windows Vista.
4. Установите языковой стандарт.
Вам нужно будет установить языковой стандарт на языковой стандарт того языка, символы которого вы хотите напечатать.
char* a = setlocale(LC_ALL, "chinese");
Возвращаемое значение интересно. Он будет содержать строку, точно описывающую, какой языковой стандарт был выбран. Просто попробуйте :-) Я тестировал chinese
и german
. Дополнительная информация: setlocale
5. Используйте вывод широких символов.
Здесь особо нечего сказать. Если вы хотите выводить широкие символы, используйте это, например:
std::wcout << L"你好" << std::endl;
Да, и не забывайте префикс L
для широких символов! И если вы вводите буквальные символы Юникода, подобные этому, в исходный файл, исходный файл должен быть закодирован в Юникоде. Как и в Visual Studio по умолчанию, это UTF-16-LE. Или, может быть, используйте notepad ++ и установите кодировку UCS-2 LE BOM
.
Пример
Наконец, я собрал все это в качестве примера:
#include <Windows.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <locale.h>
#include <wincon.h>
int wmain(int argc, wchar_t* argv[])
{
SetConsoleTitle(L"My Console Window - 你好");
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
char* a = setlocale(LC_ALL, "chinese");
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
CONSOLE_FONT_INFOEX fontInfo;
fontInfo.cbSize = sizeof(fontInfo);
fontInfo.FontFamily = 54;
fontInfo.FontWeight = 400;
fontInfo.nFont = 0;
const wchar_t myFont[] = L"KaiTi";
fontInfo.dwFontSize = { 18, 41 };
std::copy(myFont, myFont + (sizeof(myFont) / sizeof(wchar_t)), fontInfo.FaceName);
SetCurrentConsoleFontEx(hConsole, false, &fontInfo);
std::wcout << L"Hello World!" << std::endl;
std::wcout << L"你好!" << std::endl;
return 0;
}
Ваше здоровье !
person
David
schedule
25.03.2018
WriteConsoleW
- если это не так ' Если с этим работать, то это невозможно. - person user541686   schedule 29.01.2012