为什么在C ++ std :: string中对unicode字符的处理方式相同?

时间:2015-02-05 18:07:50

标签: c++ unicode

这是一个Ideone:http://ideone.com/vjByty

#include <iostream>
using namespace std;
#include <string>

int main() {
    string s = "\u0001\u0001";
    cout << s.length() << endl;
    if (s[0] == s[1]) {
        cout << "equal\n";
    }
    return 0;
}

我在很多层面上感到困惑。

在我的C ++程序中输入转义的Unicode字符串文字时,这是什么意思?

2个字符不需要4个字节吗? (假设utf-16)

为什么s(前两个字节)的前两个字符相等?

2 个答案:

答案 0 :(得分:3)

因此,C ++ 11标准草案对窄字符串文字中的通用字符进行了以下说明(强调我的前进):

  

非原始字符串文字中的转义序列和通用字符名称与中的含义相同   字符文字(2.14.3),除了单引号[...]在一个狭窄的字符串文字中,一个通用字符   由于多字节编码,可能会映射到多个char元素

并包含以下注释:

  

窄字符串文字的大小是总数   转义序列和其他字符的数量,加上至少一个用于每个字节的多字节编码   通用字符名称,加上一个用于终止'\ 0'。

上面提到的2.14.3部分说:

  

通用字符名称被转换为编码,在适当的执行字符集中   名字命名。如果没有这样的编码,则将通用字符名称转换为定义的实现   编码

如果我尝试这个例子( see it live ):

string s = "\u0F01\u0001";

第一个通用字符会映射到多个字符。

答案 1 :(得分:1)

  

在我的C ++程序中输入转义的Unicode字符串文字时,这是什么意思?

引用标准:

  

通用字符名称被转换为名称中的字符在相应执行字符集中的编码。如果没有这样的编码,则通用字符名称将转换为实现定义的编码。

通常,执行字符集将为ASCII,其中包含值为1的字符。因此\u0001将被转换为值为1的单个字符。

如果要指定非ASCII字符,例如\u263A,则每个字符可能会看到多个字节。

  

2个字符不需要4个字节吗? (假设utf-16)

如果是UTF-16,是的。但string无法使用UTF-16进行编码,除非char有16位,但通常不会。 UTF-8是一种更可能的编码,其中值最多为127的字符(即整个ASCII集)用单个字节编码。

  

为什么s的前两个字符(前两个字节)相等?

根据上述假设,它们都是值为1的字符。