双字节的字符集,并不都是双字节构成

作者:陆麟
转载请征得作者同意.
2017.11.19



看雪大会各位老炮聊天时,突然发现我的老网站还是非常受人怀念,scz更是要求我恢复更新。那就努力挑战一下自己,看看能坚持多久。手头正好还有几篇之前发的小密圈的料,勉强能顶几下。先应急一阵。:)
我们听惯了,用惯了双字节的字符集,因为我们通常使用的是双字节的编码方案。
简体中文GB2312,windows对应的码表CP936,
韩文,windows对应的码表CP949,
繁体中文,windows对应的码表CP950,
从0x81~0xfe全部都是由双字节构成。
第一个char叫做leading byte,第二个char叫做trailing byte。
例如简体中文的“诏”字,编码是0xdaaf,leading byte是0xda,trailing byte是0xaf。


日文中则比较麻烦,0x81~0x9f,0xe0~0xfc是leading byte, 0xa1~0xdf则是1个字节代码的日文假名。并不需要第2个字节构成一个正常的文字。

字符串判断,字数计算的算法就需要根据语种不同而进行分别计算。简而言之,如果不区分语种,处理过程中盲目看到大于0x80的字节就断言后面还有一个字节才能构成一个字,基本上这个程序就挺容易作死的。