我最近发现,在 Windows 10/11 上,区域设置(系统区域设置)下有一个 beta 测试选项“使用 Unicode UTF-8 进行全球语言支持”。启用此选项后,所有 ANSI Win32 系统调用都将字符串视为 UTF-8。果然,如果启用,您可以在 MSVC 中编译以下内容:
int main() {
std::cout << "Hello, World! こんにちは世界!" << std::endl;
//prints "Hello, World! こんにちは世界!"
}
然后我了解到您不必在系统范围内启用此功能,而是可以使用
/utf-8
标志来编译您的程序。因此,禁用 beta 选项并将 /utf-8
标志添加到我的项目中:
int main() {
std::cout << u8"Hello, World! こんにちは世界!" << std::endl;
//prints "Hello, World! こんにちは世界!"
}
和
int main() {
setlocale(LC_ALL, "en_US.utf-8");
std::cout << "Hello, World! こんにちは世界!" << std::endl;
//prints "Hello, World! ???????!"
}
我也尝试将
u8
添加到字符串文字中,但这没有什么区别。
使用
#pragma execution_character_set("utf-8")
和 SetConsoleOutputCP(CP_UTF8)
,例如:
#include<iostream>
#include <Windows.h>
#pragma execution_character_set("utf-8")
int main() {
SetConsoleOutputCP(CP_UTF8);
std::cout << "Hello, World! こんにちは世界!" << std::endl;
}
更新:
正如 Remy Lebeau 所说,您可以使用应用程序清单。
yourapp.manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"/>
<application>
<windowsSettings>
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
</windowsSettings>
</application>
</assembly>
在 Visual Studio 项目中添加清单
properties -> Manifest Tools -> Input and Output -> Additional Manifest Files: yourapp.manifest
或者 Visual Studio 命令提示符:
mt.exe -manifest yourapp.manifest -outputresource:yourapp.exe;#1
C++23
std::print
支持可移植的 Unicode 输出。在 Windows/MSVC 上,您只需使用 /utf-8
进行编译,无需更改任何系统设置:
#include <print>
int main() {
std::print("Hello, World! こんにちは世界!\n");
}
此打印
Hello, World! こんにちは世界!
如果尚不可用,那么您可以使用{fmt}库,
std::print
基于:
#include <fmt/base.h>
int main() {
fmt::print("Hello, World! こんにちは世界!\n");
}
免责声明:我是 C++23
std::print
和 {fmt} 的作者。