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“Я”
让编译器为您计算细节。