2013-02-24 19 views
0

我想标记输入由UTF-8字符组成。虽然有些尝试学习utf8我得到了一个我无法理解的输出。当我输入字符π(pi)时,我得到三个不同的数字207 128 10.我如何使用它们来控制它属于哪个类别?当我尝试输出UTF-8字符时,为什么会得到三个不同的数字?

ostringstream oss; 
oss << cin.rdbuf(); 

string input = oss.str(); 
for(int i=0; i<input.size(); i++) 
{ 
    unsigned char code_unit = input[i]; 
    cout << (int)code_unit << endl; 
} 

在此先感谢。

回答

3

使用UTF-8编码的字符可能占用多于一个字节(并且经常这样做)。用于编码单个代码点的字节数可以从1个字节到6个字节(或RFC 3629下的4个)不等。在π的情况下,二进制的UTF-8编码是:

11001111 10000000 

也就是说,它是两个字节。您正在单独读取这些字节。第一个字节有十进制值207,第二个有十进制值128(如果你理解为一个无符号整数)。您正在阅读的以下字节的十进制值为10,并且是您在输入时提供的换行符。

如果您打算对这些UTF-8字符进行任何处理,您将需要解释字节的含义。你需要做什么取决于你如何对角色进行分类。

+1

单个Unicode代码点可以使用最多4个字节(假设最大代码点为“U + 10FFFF”)编码为utf-8。但是一些用户感知的字符可以使用多于一个的代码点来表示(例如,一个字母和组合标记'q':'U + 0071 U + 0307 U + 0323'),因此单个字符可以表示为utf-8超过4个字节(例如,'len(u“q̣̇”.encode(“utf-8”))== 5') – jfs 2013-02-24 11:41:14

+0

@JFSebastian我在回答中将“character”改为“code point”。 – 2013-02-24 13:24:20

相关问题