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

时间:2010-03-22 16:08:02

标签: c++ string wchar-t unicode-string

示例:

#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字符串?

8 个答案:

答案 0 :(得分:77)

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

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

wcout << ru << endl << en;

答案 1 :(得分:13)

我可以建议std::wcout吗?

所以,像这样:

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

您可以在相关问题here中找到更多信息。

答案 2 :(得分:4)

您无法使用标准 C++ 工具可移植地打印宽字符串。

相反,您可以使用 the open-source {fmt} library 可移植地打印 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

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

为了比较,在 Linux 上写入 wcout

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} 的作者。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

#include <iostream>

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

输出:

  

你好
  Привет

答案 6 :(得分: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 =操作系统中的(泰国)代码页,15 =字符串的大小

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

答案 7 :(得分:-4)

我们不是在寻找简单的方法!

int i = 0;
while (ru[i]) {
   std::cout << (char)ru[i];
   i++;
}