如何将 wchar_t 值打印到控制台?
Posted
技术标签:
【中文标题】如何将 wchar_t 值打印到控制台?【英文标题】:How I can print the wchar_t values to console? 【发布时间】:2011-01-30 10:18:31 【问题描述】:例子:
#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 字符串?
【问题讨论】:
第一个相关问题是***.com/questions/1625531/… 在什么操作系统上,使用什么控制台应用程序?某些控制台不支持 Unicode。 谢谢。我正在编写一个 VC++ 控制台应用程序,它打印回命令参数,输出让我畏缩。 【参考方案1】:您不能使用标准 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 的作者。
【讨论】:
【参考方案2】:您可以使用wprintf
打印宽字符。
#include <iostream>
int main()
wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет"; //Russian language
wprintf(en);
wprintf(ru);
return 0;
输出:
你好 ???
【讨论】:
【参考方案3】: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=字符串大小
我的建议是除非必要,否则避免将非英文宽字符打印到控制台,因为这并不容易。
【讨论】:
【参考方案4】:#include <iostream>
using namespace std;
void main()
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
【讨论】:
您可以通过提供与您的代码一起使用的解释来改进此答案。 欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 why 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期价值。请edit您的答案添加解释,包括适用的限制和假设。【参考方案5】:您可以使用实际填充了 utf-8 字符的普通 char 数组。这应该允许跨语言混合字符。
【讨论】:
【参考方案6】:编辑:如果您尝试编写无法在默认语言环境中表示的文本,这将不起作用。 :-(
使用std::wcout
代替std::cout
。
wcout << ru << endl << en;
【讨论】:
它只打印英文字符串。俄语呢? 控制台不会启用 Unicode。输出重定向是挂断,它停留在 8 位字符的传统中。它只能在加载了正确控制台字体的俄语机器上输出正确的文本。 请注意,如果您尝试将其打印到 Linux 控制台,则可能会出现乱码,因为大多数 Linux 系统不使用 utf16 编码。【参考方案7】:我可以推荐std::wcout
吗?
所以,是这样的:
std::cout << "ASCII and ANSI" << std::endl;
std::wcout << L"INSERT MULTIBYTE WCHAR* HERE" << std::endl;
您可以在相关问题here 中找到更多信息。
【讨论】:
检查这是否适用于俄语(复制粘贴)。对我来说不是。 查看这个关于混合cout
和wcout
缺点的帖子。 ***.com/questions/8947949/…以上是关于如何将 wchar_t 值打印到控制台?的主要内容,如果未能解决你的问题,请参考以下文章