C++ Unicode:字符串文字和字符文字
我正在试图理解如何结合C++ Unicode:字符串文字和字符文字,c++,unicode,utf-8,C++,Unicode,Utf 8,我正在试图理解如何结合u8”“和“\uxxx”语法来获得UTF-8编码字符串。我可以在前者的内部使用后者吗?我应该吗?怎么样“\x” 我写了这个代码片段,它以4种不同的方式编码(Я): #include <iostream> #include <bitset> int main() { std::string s1 = "\xD0\xAF"; std::string s2 = u8"\xD0\xAF"; std::string s3 = "\u0
u8”“
和“\uxxx”
语法来获得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;
}
(这很好,意味着我不需要担心),但是VS制作了以下内容:
d0 af
d0 af
d0 af
d0 af
d0 af
c3 90 c2 af
3f
d0 af
因此,正确的便携式方法似乎是std::string s4=u8“\u042F”代码>。对吗?我的程序UB的输出是不是VS?< P>中的错误,根据C++规范的第2.3部分(字符集):< /P>
此外,如果通用字符名的十六进制值在
字符或字符串文字的c-char序列、s-char序列或r-char序列对应于控件
字符(在0x00–0x1F或0x7F–0x9F范围内,包括这两个范围)或基本
源字符集,程序格式不正确
这当然适用于s3的初始值设定项,所以这里有未定义的行为。除此之外,我看不出代码有什么问题
在s2情况下,VS似乎将每个字符视为unicode代码点,并用utf-8单独编码。我在规范中没有看到任何错误或正确的地方。我只能想象这是VS
中的一个错误。尤其是s2
在显式添加两个字符时,字符串中的字符数似乎有误。也许还可以打印出字符串长度?@Galik:不,s2
是对该字符串的完全有效的解释。@Nicolas可能对某些人来说是这样,但对我的标准(C++17,§15.13.3.8)来说不是这样。它表示\x
前缀字符必须限制为适合其出现的字符类型的值。对于u8
,表示char
。因此,每个\x
前缀数字代表一个char
值。在这种情况下,我们有2个,因此2个字符。我不确定如何以另一种方式读取它。另一种选择是只使用实际字符,而不是尝试手动编码其代码点/代码单位值:u8“Я”
让编译器为您计算细节。