这是一个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
(前两个字节)的前两个字符相等?
答案 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的字符。