C++ 中无前缀字符串的编码是什么?

Sou*_*a B 5 c++ string character-encoding string-literals

C++ 中无前缀字符串的编码是什么?例如,所有字符串文字在 Java 中都被解析并存储为 UTF-16,在 Python3 中则被解析为 UTF-8。我猜想 C++ 文字就是这种情况u8""。但我不清楚像 之类的普通文字""

以下代码的输出应该是什么?

#include <iostream>
#include <iomanip>

int main() {
    auto c = "Hello, World!";
    while(*c) {
        std::cout << std::hex << (unsigned int){*c++} << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在我的机器上运行它时,它会给出以下输出:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 
Run Code Online (Sandbox Code Playgroud)

但这有保证吗?字符串文字的 Cppreference 页面表示普通字符串文字中的字符来自翻译字符集,翻译字符集指出:

翻译字符集由以下元素组成:

  • 由 ISO/IEC 10646 命名的每个字符,由其唯一的 UCS 标量值标识,以及
  • 每个 UCS 标量值的不同字符,其中未分配命名字符。

从这个定义来看,翻译字符集似乎是指 Unicode(或其超集)。那么除了显性之外,""和之间没有区别吗?u8""

假设如果我希望我的字符串采用 EBCDIC 编码(只是作为练习),那么在 C++ 中实现它的正确方法是什么?

编辑:字符串文字的链接 Cppreference 页面确实说它是实现定义的。这是否意味着我应该避免使用它们?

Mar*_*k R 3

字符串文字的编码由编译器设置控制。默认设置取决于编译器。AFAIK 默认情况下 MSVC 使用系统区域设置定义的编码。在 gcc/clang 上假定为 utf-8。

在 MSVC 中,您可以使用/execution-charset: switch来更改此设置。Gcc clang 有-fexec-charset= 开关

请注意,您必须指示标准库字符串文字的当前编码是什么。这是 的特点之一std::locale::global

这是我的另一个答案,我用 MSVC 做了一些实验。


归档时间:

查看次数:

310 次

最近记录:

2 年,10 月 前