为什么 MSVC 中的 /utf-8 标志不允许我的程序显示 Unicode 字符?

问题描述 投票:0回答:2

我最近发现,在 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
添加到字符串文字中,但这没有什么区别。

c++ visual-studio unicode utf-8
2个回答
0
投票

使用

#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


0
投票

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} 的作者。

© www.soinside.com 2019 - 2024. All rights reserved.