例子:
#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字符串?
例子:
#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字符串?
编辑:如果你要写不能在默认语言环境中表示的文本,这种方法是不起作用的。 :-(
使用 std::wcout
代替 std::cout
。
wcout << ru << endl << en;
wcout
不与UNICODE字符一起使用时,它是用来做什么的? - hfrmobile我可以建议使用std::wcout
吗?
那么,类似于这样:
std::cout << "ASCII and ANSI" << std::endl;
std::wcout << L"INSERT MULTIBYTE WCHAR* HERE" << std::endl;
您可能会在一个相关问题这里找到更多信息。
cout
和 wcout
的问题的线程。https://dev59.com/vmox5IYBdhLWcg3wznk0 - Jesse Chisholm使用标准的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-8
编译选项进行编译。wcout
写入:wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет";
std::wcout << ru << std::endl << en;
可以将俄语文本转写为拉丁文(https://godbolt.org/z/za5zP8):
Privet
Hello
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
}
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
}
做法是将UTF-16 LE(默认Windows编码)转换为UTF-8,然后打印到控制台(首先使用chcp 65001
切换代码页为UTF-8)。
将UTF-16转换为UTF-8非常简单。如果需要处理超过2个字节的字符,请使用此页面作为指南。
short* cmd_s = (short*)cmd;
while(cmd_s[i] != 0)
{
short u16 = cmd_s[i++];
if(u16 > 0x7F)
{
unsigned char c0 = ((char)u16 & 0x3F) | 0x80; // Least significant
unsigned char c1 = char(((u16 >> 6) & 0x1F) | 0xC0); // Most significant
cout << c1 << c0; // Use Big-endian network order
}
else
{
unsigned char c0 = (char)u16;
cout << c0;
}
}
您可以使用wprintf
打印宽字符。
#include <iostream>
int main()
{
wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет"; //Russian language
wprintf(en);
wprintf(ru);
return 0;
}
输出:
你好
Привет