GB2312编码方式下中英文字符分离问题
2008-06-11 12:59
218 查看
题目:
定义 CString str ="沃尔玛123我的356开始";非unioncode
怎么样把字符串的中文和数字区分;
返回结果 rstr1 = “沃尔玛我的开始” rstr2 = “123356”。
我按照单字符截取时总是出现乱码?请求大侠们指导!
下面是“飞雪”大哥的回帖,感觉很不错:留在我的博客里,以便以后借鉴!
沃尔玛我的开始
相关资料:
GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集--基本集》,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于大陆;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312。
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。
GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
分析:因为高位字节和低位字节都加上了0xA0,所以这2个字节都会>10100000(0xA0),必然也会大于等于10000000(128),也就大于127,其实更严格的说是大于0xA0,但是由于所有的ASCII字符都是小于等于127的(最大的ASCII码为127的是DEL),所以这里用>127来判断也是正确的。
所以下面的代码应该更严格一些:
定义 CString str ="沃尔玛123我的356开始";非unioncode
怎么样把字符串的中文和数字区分;
返回结果 rstr1 = “沃尔玛我的开始” rstr2 = “123356”。
我按照单字符截取时总是出现乱码?请求大侠们指导!
下面是“飞雪”大哥的回帖,感觉很不错:留在我的博客里,以便以后借鉴!
#include #include using namespace std; int main(int argc, char* argv[]) { string src ="沃尔玛123我的356开始"; string str1, str2; for (int i = 0; i < src.length();) if ((unsigned char)src[i] > 127) str1 += src[i++], str1 += src[i++]; else str2 += src[i++]; cout << str1 << endl << str2 << endl; return 0; }
沃尔玛我的开始
相关资料:
维基百科:GB2312编码
GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集--基本集》,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于大陆;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312。
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。
GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。
分区表示
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
字节结构
在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
分析:因为高位字节和低位字节都加上了0xA0,所以这2个字节都会>10100000(0xA0),必然也会大于等于10000000(128),也就大于127,其实更严格的说是大于0xA0,但是由于所有的ASCII字符都是小于等于127的(最大的ASCII码为127的是DEL),所以这里用>127来判断也是正确的。
所以下面的代码应该更严格一些:
#include #include using namespace std; int main(int argc, char* argv[]) { string src ="沃尔玛123我的356开始"; string str1, str2; for (int i = 0; i < src.length();) if ((unsigned char)src[i] > 0xA0) str1 += src[i++], str1 += src[i++]; else str2 += src[i++]; cout << str1 << endl << str2 << endl; return 0; }
相关文章推荐
- Java不同编码方式,中英文字符所占字节数
- 字符的编码问题,,,之计算机理解我们的方式
- 有关宽字符wchar_t编码方式的问题
- 在无法判断ANSI还是UICODE编码方式下的字符函数的使用
- 关于使用CXF出现编码 GBK 的不可映射字符问题解决
- [置顶] CXF出现编码 GBK 的不可映射字符问题解决
- 解决Java提示“编码GBK的不可映射字符”的问题
- JS 和 Java 中URL特殊字符编码方式
- 字符的编码问题
- 中文化和国际化问题权威解析之六:MIME编码/字符传输编码
- JAVA字符编码系列三:Java应用中的编码问题
- python替换UTF-8编码文本中任意特殊字符,包括中文符号问题:大量文本,将其中的特殊字符用空
- 小议关于java字符编码的问题
- Python中的字符串与字符编码:编码和转换问题
- 在Ant的javac中指定源文件编码方式,以避免"警告: 编码 GBK 的不可映射字符"的错误
- 【问题一】notepad++编辑器写Java代码,无法编译出现错误:编码GBK的不可映射字符
- JAVA字符编码系列三:Java应用中的编码问题
- JS通过Get方式调用接口编码问题
- android读取文件时乱码的问题,以及eclipse中java编码查看方式
- js特殊字符编码问题