C++中文分割
28 Dec 2012 c++ 字符串
其实最近一直都有遇到c++内的中文字符串问题,不过一直都通过各种方法绕过了。
可是今天遇到了需要将字符串的中文和英文按字符分割的问题,实在是没有取巧的方法了。
由于从资源文件读取出来的是utf-8编码,而输出时也是用的utf-8编码。如果在中途对字符串进行转化处理的话实在是没有什么必要性。其实一直很好奇,无论是什么格式的编码,windows都是能正常识别的。最重要的是size和length返回的长度不同的话,那么内部就一定有相应的检测机制。于是,开始找字符编码相关的资料。以结论而言是这样的,UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
至于具体编码对应字符是怎样的其实并不重要了,对于分割utf-8字符而言,只要知道编码规则就好了。于是,接下来的工作就简单了。
sum = strlen(fullline);
for(int cur = 0;cur<sum;cur++)
{
char t = fulline[cur];
if((t&0xE0) == 0xE0){ //3byte
lines = lines + t + fulline[cur+1] + fulline[cur+2];
cur += 3;
}else if((t&0xC0) == 0xC0){//2byte
lines = lines + t + fulline[cur+1];
cur += 2;
}else{//1byte
lines = lines + t;
cur++;
}
printf("streaming text:%s",lines.c_str());
}
至于GB2312编码,由于固定是双字节的,分割上就不会有什么问题了。