C/C++的基本功了,在看ICTCLAS分词源码的时候偶然看到,写段例子验证一下。
由于ANSI字符有128个, 所以, ANSI字符的bit最高位为0, 当bit最高位为1时, 就表示是个双字节字符了。而char(也即是signed char)的正负恰好由最高位决定,于是直接利用char < 0 来判断是否是双字节字符了。
#include <iostream> using namespace std; ///////////////////////////SubMain////////////////////////////////// int main(int argc, char *argv[]) { char szText[] = "hankcs是坏蛋"; unsigned int nPosIndex = 0, // 当前指针 nParagraphLen = strlen(szText); // 源字串长度 char sChar[3]; sChar[2] = 0; while (nPosIndex < nParagraphLen) { sChar[0] = szText[nPosIndex];//Get a char // 取一个字符 sChar[1] = 0; if (sChar[0] < 0) // 双字节字符 { nPosIndex += 1; sChar[1] = szText[nPosIndex]; cout << sChar << " 是双字节字符" << endl; } else { cout << sChar << " 是单字节字符" << endl; } nPosIndex += 1; } system("pause"); return 0; } ///////////////////////////End Sub//////////////////////////////////
输出:
h 是单字节字符 a 是单字节字符 n 是单字节字符 k 是单字节字符 c 是单字节字符 s 是单字节字符 是 是双字节字符 坏 是双字节字符 蛋 是双字节字符 请按任意键继续. . .