提问人:Chris_F 提问时间:6/23/2023 更新时间:7/4/2023 访问量:430
为什么 MSVC 中的 /utf-8 标志不允许我的程序显示 Unicode 字符?
Why is the /utf-8 flag in MSVC not allowing my program to display Unicode characters?
问:
我最近发现,在 Windows 10/11 上,区域设置(系统区域设置)下有一个 beta 测试选项,用于“使用 Unicode UTF-8 提供全球语言支持”。启用此功能后,所有 ANSI Win32 系统调用都将字符串视为 UTF-8。当然,如果启用,您可以在 MSVC 中编译以下内容:
int main() {
std::cout << "Hello, World! こんにちは世界!" << std::endl;
//prints "Hello, World! こんにちは世界!"
}
然后我读到您不必在系统范围内启用它,而是可以使用该标志编译您的程序。因此,禁用 beta 选项并将标志添加到我的项目中:/utf-8
/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
答:
0赞
Minxin Yu - MSFT
6/23/2023
#1
使用 和 ,例如:#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 项目中添加清单Add the manifest in Visual Studio Projectproperties -> Manifest Tools -> Input and Output -> Additional Manifest Files: yourapp.manifest
或 Visual Studio 命令提示符:
mt.exe -manifest yourapp.manifest -outputresource:yourapp.exe;#1
评论
0赞
Chris_F
6/23/2023
这适用于控制台输出,但例如不起作用。MessageBoxA
0赞
Minxin Yu - MSFT
6/23/2023
但是已经有用于 unicode 的 MessageBoxW。::MessageBoxW(m_hWnd, L"Hello, World! こんにちは世界", L"", NULL);;
1赞
Chris_F
6/23/2023
这个问题的范围是将 Windows 的新 UTF-8 用于 ANSI 功能,这样您就不必执行 UTF-8 > UTF-16 转换。
0赞
Minxin Yu - MSFT
6/23/2023
从链接: “Beta: Use Unicode UTF-8 for worldwide language support”实际上有什么作用? Beta 选项修改了注册表选项:ACP、MACCP 和 OEMCP。该复选框强制它们使用 UTF-8(代码页 65001)。修改后,我能够正确打印字符。
0赞
Remy Lebeau
6/30/2023
使用应用清单在 API 中启用 UTF-8 行为,然后将字符串解释为 UTF-8(前提是它实际上正确编码了 UTF-8)。A
MessageBoxA()
评论