This question already has answers here:
How are u8-literals supposed to work?
(2个答案)
3个月前关闭。
在到处都阅读了utf8之后,我试图更改一些代码以使用std :: string。我假设如果将std :: string设置为u8“€”(这是键盘上的欧元符号AltGr + 4),则std :: string将具有3个字节,其中包含欧元符号的unicode码(\ U20AC)。没有。考虑
如果我在调试器局部变量中查看结果,则会看到
和
从我可以看到的最后两个是唯一给我预期结果的。我显然缺少与字符串文字有关的内容,但是我也感到困惑,因为调试器认为前两个字符长度为
也是为什么为什么'€'=='\€'但“€”!=“ \€”和u8“€”!= u8“ \€”。(编辑:忽略此。Remy在重新比较char时指出了我的错误指针)。
结果还引发了一个问题,即u8字符串文字前缀的用途是什么?
在恢复到wchar_t之前,有人可以解释吗?
我在Windows 10上使用RAD studio 10.2。
编辑:使用字符映射工具将其与各种非ASCII Unicode字符进行了尝试。无法与任何人一起使用。 size()始终为1,调试器显示的字符与我使用的字符不同(通常为'?')。我使用的是Surface Pro类型的保护套,但据我所知,无法使用键盘输入随机的Unicode字符(除€外)。从现在开始,严格为我反斜杠代码。很高兴即使我浪费了一整天,我也已经清除了它。谢谢大家
(2个答案)
3个月前关闭。
在到处都阅读了utf8之后,我试图更改一些代码以使用std :: string。我假设如果将std :: string设置为u8“€”(这是键盘上的欧元符号AltGr + 4),则std :: string将具有3个字节,其中包含欧元符号的unicode码(\ U20AC)。没有。考虑
std::string x[] = {"€", u8"€", u8"\€", "\u20AC", u8"\u20AC"}
size_t size[] = {x[0].size(), x[1].size(), x[2].size(), x[3].size(), x[4].size()};
如果我在调试器局部变量中查看结果,则会看到
x[] = {"€", "€", "â??", "€", "€"}
和
size[] = {1, 1, 3, 3, 3}
从我可以看到的最后两个是唯一给我预期结果的。我显然缺少与字符串文字有关的内容,但是我也感到困惑,因为调试器认为前两个字符长度为
(int64_t(x[0].c_str()[0]) == int64_t(x[1].c_str()[0]) == -128
,所以前两个如何显示正确的字符串。也是为什么为什么'€'=='\€'但“€”!=“ \€”和u8“€”!= u8“ \€”。(编辑:忽略此。Remy在重新比较char时指出了我的错误指针)。
结果还引发了一个问题,即u8字符串文字前缀的用途是什么?
在恢复到wchar_t之前,有人可以解释吗?
我在Windows 10上使用RAD studio 10.2。
编辑:使用字符映射工具将其与各种非ASCII Unicode字符进行了尝试。无法与任何人一起使用。 size()始终为1,调试器显示的字符与我使用的字符不同(通常为'?')。我使用的是Surface Pro类型的保护套,但据我所知,无法使用键盘输入随机的Unicode字符(除€外)。从现在开始,严格为我反斜杠代码。很高兴即使我浪费了一整天,我也已经清除了它。谢谢大家
最佳答案
我假设如果将std :: string设置为u8“€”(这是键盘上的欧元符号AltGr + 4),则std :: string将具有3个字节,其中包含欧元符号的unicode码(\ U20AC)。没有。
应该,是的。 u8
前缀确保将文字存储为最终可执行文件中的UTF-8,并且U + 20AC实际上在UTF-8中编码为3个字节。如果您看到不同的内容,则可能是编译器错误,应报告给Embarcadero。
考虑到调试器认为它们是一个字符长且(int64_t(x[0].c_str()[0]) == int64_t(x[1].c_str()[0]) == -128
,我也感到困惑,调试器如何为前两个显示正确的字符串。
第二个应为3个字节,而不是1个字节。
由于两者均为1字节,因此显示仅是偶然的。字符串文字上没有前缀,因此使用编译器的默认ANSI字符集对其进行解释,在您的情况下,该字符集必须恰好在字节0x80处具有欧元符号。
也是为什么为什么'€'=='\€'但是“€”!=“ \€”和u8“€”!= u8“ \€”。
因为第一个比较实际的char
值,而其他比较的是原始的char*
指针,而不是实际的char
值。
结果还引发了一个问题,即u8字符串文字前缀的用途是什么?
正是您所期望的-它应该使编译器以UTF-8编码输出字符串文字的内容。
关于c++ - 为什么'€'=='\€'但为什么“€”!=“\€”和u8“€”!= u8“\€” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57858567/
10-12 23:58