为什么在C++std::string中对unicode字符一视同仁
Why are unicode characters treated the same in C++ std::string?
这里有一个Ideone:http://ideone.com/vjByty.
#include <iostream>
using namespace std;
#include <string>
int main() {
string s = "u0001u0001";
cout << s.length() << endl;
if (s[0] == s[1]) {
cout << "equaln";
}
return 0;
}
我在很多层面上都感到困惑。
当我在C++程序中键入转义的Unicode字符串文字时,这意味着什么?
2个字符不应该用4个字节吗?(假设utf-16)
为什么s
的前两个字符(前两个字节)相等?
因此,C++11标准草案规定了以下关于窄字符串文字中的通用字符(emphasis mine forward):
非原始字符串文字中的转义序列和通用字符名与中的含义相同字符文字(2.14.3),除了单引号[…]在窄字符串文字中,通用字符名由于多字节编码,可能映射到多个字符元素
包括以下注释:
窄字符串文字的大小是总数转义序列和其他字符的数量,加上每个字符的至少一个多字节编码通用字符名,加上一个用于终止的"\0"。
上文提及的2.14.3
节规定:
通用字符名被翻译为名为的字符。如果没有这样的编码,则通用字符名将被转换为定义的实现编码。
如果我尝试这个例子(看到它直播):
string s = "u0F01u0001";
第一个通用字符确实映射到多个字符。
当我在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的字符。
- 如何存储 unicode 字符并将其输出到文件?
- C++:打印 Unicode 字符
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 获取Unicode字符C++的十进制值
- 用wchar_t处理 unicode 字符好吗?它不会引起任何问题吗?
- C++:如何将 unicode 字符打印到文本文件
- 动态计算 unicode 字符
- 如何将整数转换为 unicode 字符
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- MessageBox打印来自TCHAR缓冲区的额外Unicode字符
- 如何将小数NCR转换为Unicode字符(C )
- SQLGetPrivateProfileString 错误地读取 Unicode 字符
- 将 Unicode 字符/字符串写入文件
- 将 Unicode 字符存储在.txt文件中的新行中
- 从终端 C++ 中的字符串中打印出 unicode 字符
- Unicode 字符分类与 boost::locale
- 字符数组中的滤波器unicode字符
- Unicode 字符问题/转换参数
- 从包含Unicode字符的文件中读取
- 从ASCII到Unicode字符代码的转换(FreeType2)