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)。没有。考虑

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