如何将wchar_t值打印到控制台?


73

例:

#include <iostream>

using namespace std;

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

此代码仅打印地址的十六进制值。如何打印wchar_t字符串?


该第一个相关的问题是stackoverflow.com/questions/1625531/...

在什么操作系统上,使用什么控制台应用程序?某些控制台不支持Unicode。
没有人

谢谢。我正在编写一个VC ++控制台应用程序,该应用程序回显了命令参数,输出使我感到畏缩。
詹姆斯·柯

Answers:


89

编辑:如果您尝试编写无法在默认语言环境中表示的文本,则此方法将无效。:-(

使用std::wcout代替std::cout

wcout << ru << endl << en;

3
它仅打印英文字符串。俄语呢?
zed91

8
控制台将不会启用Unicode。输出重定向是挂断,卡在8位char传统中。它只能在俄语计算机上输出正确的文本,并加载正确的控制台字体。
汉斯·帕桑

请注意,如果您尝试将其打印到Linux控制台,则由于大多数Linux系统未使用utf16编码,因此最终可能会出现乱码。
比昂·林德奎斯特


4

您不能使用标准C ++设施可移植地打印宽字符串。

相反,您可以使用开源{fmt}库来可移植地打印Unicode文本。例如(https://godbolt.org/z/nccb6j):

#include <fmt/core.h>

int main() {
  const char en[] = "Hello";
  const char ru[] = "Привет";
  fmt::print("{}\n{}\n", ru, en);
}

版画

Привет
Hello

这需要使用/utf-8MSVC中的编译器选项进行编译。

为了进行比较,wcout在Linux上进行写入:

wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет";
std::wcout << ru << std::endl << en;

可以将俄语文本音译为拉丁语(https://godbolt.org/z/za5zP8):

Privet
Hello

可以通过切换到使用UTF-8的语言环境来解决此特定问题,但是Windows上存在类似的问题,而仅使用标准工具无法解决。

免责声明:我是{fmt}的作者。


0

您可以使用实际上填充了utf-8字符的普通char数组。这应该允许跨语言混合字符。


0
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
}

2
您可以通过提供与代码一起的解释来改善此答案。
James Elderfield '16

1
欢迎使用Stack Overflow!尽管此代码可能有助于解决问题,但并未解释为什么和/或如何回答问题。提供这种额外的环境将大大提高其长期价值。请编辑您的答案以添加解释,包括适用的限制和假设。
Toby Speight,

0

Windows具有非常混乱的信息。在Windows中进行编程之前,您应该从Unix / Linux学习C / C ++概念。

wchar_t将字符存储在UTF-16中,该字符是固定的16位内存大小,称为宽字符,但是wprintf()或wcout()永远不会正确打印非英语宽字符,因为在UTF-16中不会输出任何控制台。Windows将以当前语言环境输出,而unix / linux将以UTF-8输出,所有均为多字节。因此,您必须在打印之前将宽字符转换为多字节。Unix命令wcstombs()在Windows上不起作用,请改用WideCharToMultiByte()。

首先,您需要使用记事本或其他编辑器将文件转换为UTF-8。然后在命令提示符控制台中安装字体,以便它可以使用您的语言进行读/写,并将控制台中的代码页更改为UTF-8,以便在cygwin已默认为UTF-8的情况下键入命令提示符“ chcp 65001”来正确显示。这是我在泰语中所做的。

#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 =(Thai)代码页在操作系统中,15 =字符串的大小

我的建议是除非有必要,否则避免将非英语宽字符打印到控制台,因为这并不容易。


0

您可以使用来打印宽字符wprintf

#include <iostream>

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

输出:

你好
Привет

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.