85

例子:

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

4

7 回答 7

103

编辑:如果您尝试编写无法在默认语言环境中表示的文本,这将不起作用。:-(

使用std::wcout而不是std::cout.

wcout << ru << endl << en;
于 2010-03-22T16:11:21.777 回答
16

我可以建议std::wcout吗?

所以,像这样:

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

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

于 2010-03-22T16:10:53.147 回答
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} 的作者。

于 2020-12-28T15:37:33.407 回答
2

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,以便通过在命令提示符“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=字符串大小

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

于 2018-09-21T10:57:25.067 回答
1
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
}
于 2016-08-11T12:00:23.267 回答
0

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

于 2010-03-22T17:56:04.270 回答
0

您可以使用 打印宽字符wprintf

#include <iostream>

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

输出:

你好
Привет

于 2018-08-20T20:38:22.107 回答