Как я могу вывести значения wchar_t на консоль? - PullRequest
62 голосов
/ 22 марта 2010

Пример:

#include <iostream>

using namespace std;

int main()
{
    wchar_t en[] = L"Hello";
    wchar_t ru[] = L"Привет"; //Russian language
    cout << ru
         << endl
         << en;
    return 0;
}

Этот код печатает только HEX-значения, такие как адрес. Как напечатать строку wchar_t?

Ответы [ 7 ]

77 голосов
/ 22 марта 2010

Редактировать: это не работает, если вы пытаетесь написать текст, который не может быть представлен в вашей локали по умолчанию. : - (

Используйте std::wcout вместо std::cout.

wcout << ru << endl << en;
13 голосов
/ 22 марта 2010

Могу ли я предложить std::wcout?

Итак, как-то так:

std::cout << "ASCII and ANSI" << std::endl;
std::wcout << L"INSERT MULTIBYTE WCHAR* HERE" << std::endl;

Вы можете найти больше информации в связанном вопросе здесь .

0 голосов
/ 21 сентября 2018

Windows имеет очень запутанную информацию. Вы должны изучить концепцию C / C ++ из Unix / Linux перед программированием в Windows.

wchar_t хранит символ в UTF-16, который является фиксированным 16-разрядным объемом памяти, называемым широким символом, но wprintf () или wcout () никогда не будут правильно печатать неанглийские широкие символы, потому что в UTF-16 не будет выводиться консоль. Windows будет выводить данные в текущей локали, тогда как unix / linux будет выводить в UTF-8, все они многобайтовые. Поэтому перед печатью необходимо преобразовать широкие символы в многобайтовые. Команда unix wcstombs () не работает в Windows, используйте вместо нее WideCharToMultiByte ().

Сначала вам нужно конвертировать файл в UTF-8 с помощью блокнота или другого редактора. Затем установите шрифт в консоли командной строки, чтобы он мог читать / писать на вашем языке и изменить кодовую страницу в консоли на UTF-8 для правильного отображения, введя в командной строке «chcp 65001», в то время как cygwin уже по умолчанию использует UTF-8. Вот что я сделал на тайском языке.

#include <windows.h>
#include <stdio.h>

int main()
{
    wchar_t* in=L"ทดสอบ"; // thai language
    char* out=(char *)malloc(15);
    WideCharToMultiByte(874, 0, in, 15, out, 15, NULL, NULL);
    printf(out); // result is correctly in Thai although not neat
}

Обратите внимание, что 874 = (тайская) кодовая страница в операционной системе, 15 = размер строки

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

0 голосов
/ 20 августа 2018

Вы можете печатать широкие символы с помощью wprintf.

#include <iostream>

int main()
{
    wchar_t en[] = L"Hello";
    wchar_t ru[] = L"Привет"; //Russian language
    wprintf(en);
    wprintf(ru);
    return 0;
}

Вывод:

Hello
Привет

0 голосов
/ 11 августа 2016
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
}
0 голосов
/ 15 октября 2014

мы не ищем легких путей!

int i = 0;
while (ru[i]) {
   std::cout << (char)ru[i];
   i++;
}
0 голосов
/ 22 марта 2010

Вы можете использовать обычный массив символов, который на самом деле заполнен символами utf-8. Это должно позволить смешивать символы на разных языках.

...