gpt4 book ai didi

c++ - Unicode:字符串文字和字 rune 字

转载 作者:行者123 更新时间:2023-11-30 05:04:14 25 4
gpt4 key购买 nike

我想了解应该如何结合 u8"""\uxxxx" 语法来获得 UTF-8 编码的字符串。我可以在前者的内部使用后者吗?我是不是该? "\x" 怎么样?

我写了这段编码 Я 的代码片段(Я) 有 4 种不同的方式:

#include <iostream>
#include <bitset>

int main()
{
std::string s1 = "\xD0\xAF";
std::string s2 = u8"\xD0\xAF";
std::string s3 = "\u042F";
std::string s4 = u8"\u042F";

for(unsigned char c : s1)
std::cout << std::hex << int(c) << ' ';
std::cout << std::endl;

for(unsigned char c : s2)
std::cout << std::hex << int(c) << ' ';
std::cout << std::endl;

for(unsigned char c : s3)
std::cout << std::hex << int(c) << ' ';
std::cout << std::endl;

for(unsigned char c : s4)
std::cout << std::hex << int(c) << ' ';
std::cout << std::endl;

return 0;
}

结果令人困惑。 Clang 和 GCC 都产生了这个:

d0 af 
d0 af
d0 af
d0 af

(这很好,意味着我不需要担心),但是 VS 产生了这个:

d0 af 
c3 90 c2 af
3f
d0 af

看起来正确的可移植方式是 std::string s4 = u8"\u042F";。那是对的吗?我的程序的输出是 UB 还是 VS 中的错误?

最佳答案

根据 C++ 规范的第 2.3 节(字符集):

Additionally, if the hexadecimal value for a universal-character-name outside the c-char-sequence, s-char-sequence, or r-char-sequence of a character or string literal corresponds to a control character (in either of the ranges 0x00–0x1F or 0x7F–0x9F, both inclusive) or to a character in the basic source character set, the program is ill-formed.

这肯定适用于 s3 的初始化器,所以你会在这里得到未定义的行为。除此之外,我看不出代码有任何问题。

在 s2 的情况下,VS 似乎将每个字符都视为一个 unicode 代码点,并在 utf-8 中对其进行单独编码。我在规范中没有看到任何内容表明这是错误的还是正确的。

关于c++ - Unicode:字符串文字和字 rune 字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49000469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com