一、关于GB2312编码的必要知识

GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持 ISO/IEC10646—1 和 GB 13000—1 的全部中、日、韩(CJK)汉字,共计20902字。

1 分区表示

基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。

2 国标码和计算机机内码

把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。
说到这里,有同学要问了,区位码不是已经可以表示汉字了吗?为什么还要搞出来了国标码和计算机内码?听我给你慢慢道来。
GB2312虽然说是对中文编码,但是里面有对26个英文字母和一些特殊符号的编码,按理说这和ASCII重合的部分应该无需设置,沿用ASCII中不就行了?但是当时在制定GB2312之前,就决定覆盖掉ASCII中符号和英文字母部分,所以将其中的英文字母和符号重新编入GB2312中。而对于ASCII中前32个控制字符则继续沿用。所以保留前32字符,就需要将汉字编码向后偏移32,十六进制20H,这也就是区位码要加上20H得到国标码,这就是GB2312的编码规范。
好了,解释清楚为什么要从区位码转为国标码,那为什么国标码还要转为机内码呢?这是为了避免和ASCII码编码的字符冲突。还以“啊”为例,它的区位码为1601,那么国标码就是区码和位码分别加上20H,得到3021H,那么计算机在读取这个数字的时候,首先读取30,是个控制位,然后读取21,还是个控制位,这样就会出现乱码。为了解决这个问题,汉字机内码就横空出世了。
先说定义,汉字的机内码是计算机系统内部对汉字进行存储、处理、传输统一使用的代码,又称为汉字内码。大家要明白,计算机在实际存储一个汉字时,实际上存储的不是区位码或者国标码,而是机内码。而机内码实际上是汉字的区位码分别加上A0H。因为ASCII中使用7位,最高位为0;而汉字的机内码在区位码加上A0H后,字节的最高位变为1了,这样就区分开了ASCII和GB2312。
还以“啊”为例,它的区位码是1601,但实际上它在计算机内部存储的的编码(假定执行时采用GBK编码方式)是B0A1H(注意,存储的第一个字节为B0,第二个字节为A1).

3 字节结构

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节”),第二个字节称为“低位字节”(也称“位字节”)。

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。

了解了上述基础知识之后,我们就可以知道了,计算机获取了汉字的ANSI编码之后,高位字节和低位字节分别减去0Xa0之后,就可以得到区位码。再根据汉字的区位码,确定汉字是一级还是二级汉字,确定其拼音首字母。

二、代码实现

//该函数可以获取一个汉字字符串的拼音首字母
//strSrc为输入的源字符串,strResult为返回的拼音首字母字符串
void GetWord1stLetter(const CString& strSrc, CString & strResult)
{strResult.Empty();if (strSrc.IsEmpty())return;byte ucHigh, ucLow;int nCode;CString strRet;//由于GetString返回的是wchar_t类型的字符串,而宽字符类型在程序执行时采用Unicode编码规范,//UTF-16编码方式;因此,为了找出和GB2312的对应关系,需要首先转换为ANSI编码方式std::string strAnsi = CT2A(strSrc.GetString());size_t nLength = strAnsi.length();for (size_t i = 0; i < nLength; i++){if ((unsigned)strAnsi[i] < 0x80)    //accii码{strResult += strAnsi[i];continue;}//获取汉字的区位码。由于汉字的机内码采用EUC-CN编码方式,因此第1个字节就是高位字节,//第2个字节就是低位字节,这两个字节分别减去0xa0,就是汉字的区位码if (i + 1 < nLength)    //防止越界{ucHigh = (byte)strAnsi[i];ucLow = (byte)strAnsi[i + 1];if (ucHigh < 0xa1 || ucLow < 0xa1)continue;elsenCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;GetChs1stLetter(nCode, strRet);strResult += strRet;i++;}}
}//该接口根据汉字区位码获取汉字的拼音首字符
void GetChs1stLetter(int nCode, CString& strLetter)
{if (nCode <= 1600)return;//一级汉字按照拼音顺序排序,该数组存储汉字拼音分隔位置static int ari1stSecPosValue[] ={1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212,3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249};//存储汉语拼音的首字母static TCHAR psz1stLetter[] = _T("ABCDEFGHJKLMNOPQRSTWXYZ");//存储二级汉字拼音的首字母static TCHAR psz2ndSecTbl[] =_T("CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY")      _T("LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY")_T("WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY")_T("DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP")_T("MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB")_T("PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX")_T("YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS")_T("QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ")_T("YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK")_T("HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ")_T("FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ");size_t nSecondSecTable = _tcslen(psz2ndSecTbl);if (nCode > 1600 && nCode < 5590)  //一级汉字 16-55区{for (int j = 22; j >= 0; j--){if (nCode >= ari1stSecPosValue[j]){strLetter = psz1stLetter[j];break;}}}else   //二级汉字 56-87区,通过查表获取拼音首字母{//根据区位码确定拼音首字母int iHiDig = nCode / 100;int iLoDig = nCode % 100;nCode = (iHiDig - 56) * 94 + iLoDig - 1;if (nCode >= 0 && nCode < nSecondSecTable) //其他生僻字不再处理strLetter = psz2ndSecTbl[nCode];}
}

VC++中如何获取GB2312字符集中汉字拼音首字母相关推荐

  1. sqlserver中,sql语句,按照汉字拼音首字母排序

    sqlserver 中: select  * from table order by userName collate Chinese_PRC_CS_AS_KS_WS 注释: collate:指的是定 ...

  2. 在delphi 7中实现获取汉字拼音首字母

    公司的餐饮系统出品的助记码,还没实现自动从出品名称获取汉字拼音首字母. 所以在网上找了三种解决方法, 一种是kaguo 的使用常用汉字拼音查找方法,这种代码十分简单,实现方便,但是这种代码仅仅是一级字 ...

  3. Excel中如何获取汉字拼音首字母

    Excel中如何获取汉字拼音首字母 在工作中,为了方便查询.排序或者编码,需要生成汉字内容信息的首字母,如果信息很多的话,一个个录入是一件很麻烦的事情,下面给大家介绍一个便捷的方法,轻松获取汉字拼音首 ...

  4. 在Excel中如何获取汉字拼音首字母?

    转自:https://jingyan.baidu.com/article/0a52e3f43c3f6abf63ed7259.html百度经验 在Excel中如何获取汉字拼音首字母?| 在工作中,为了方 ...

  5. php获取汉字的首字母,php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序.这是中国人大多数使用的排序方法.那么在php程序中该如何操作呢? 下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的 ...

  6. mysql获取汉字拼音首字母_MySQL数据库获取汉字拼音的首字母函数

    需求简介:最 近的一个项目,想实现如下图所示的显示效果.很明显,如果能够获取对应的汉字词组的拼音首字母就可以实现了,如果是固定的几个汉字,人为的拼一下就可以 了,不过项目中有多处功能是需要这个效果的, ...

  7. iOS 获取汉字拼音首字母

    iOS获取汉字首字母 这个一般用在通讯里排序居多,我这里就是用到了通讯里的排序,然后就来mark一下,记录. 核心代码 char pinyinFirstLetter(unsigned short ha ...

  8. 【C#】获取汉字拼音首字母和全拼

    文章目录 利用CJK统一表意符号获取首字母 获取首字母和全拼 另附sql server解决方案 来源 java的同学可以了解下pinyin4j,js可以了解ChinesePY.js 获取拼音的意义多在 ...

  9. php 获取首字母,PHP_php 获得汉字拼音首字母的函数,php获取汉字拼音的第一个字母 - phpStudy...

    php 获得汉字拼音首字母的函数 php获取汉字拼音的第一个字母 复制代码 代码如下: function getinitial($str) { $asc=ord(substr($str,0,1)); ...

最新文章

  1. Python 标准库之 os (获取当前目录、读取/设置环境变量、重命名文件、运行shell命令、创建/删除/查看目录文件、判断目录/文件/存在、获取绝对路径、获取文件名、获取换行符、获取路径分隔符)
  2. 【神经网络】(2) 网络优化,案例:服装图像分类,附python完整代码
  3. SAP MM Return Purchase Order之使用
  4. 云盘存储 教学反思_对设计训练的设计:以建筑工房工作模型课题的教学实验为例对设计训练方法论的反思...
  5. PHP如何添加自带的扩展库
  6. CentOS7下zip解压和unzip压缩文件
  7. 程序从命令行接收多个数字,求和之后输出结果。
  8. 使用ASIHTTPRequest进行http 请求bug
  9. 阿里免费开放一切AI算力的背后是什么?
  10. 新手程序员必学的代码编程技巧
  11. 使用pyecharts绘制新冠肺炎疫情地图
  12. qlabel显示两行_PyQt5 系统化学习: QLabel
  13. 关于LCR表和万用表测电容容值不一样的怪事
  14. JavaScript前端数据呈现——Table会拐弯的column,数据分多列展示
  15. python中 jsonchema 与 shema 效率比较
  16. 巅峰极客pwn wp
  17. 关于环境变量 C++ include搜索路径,lib库搜索路径
  18. 鸿蒙开发起步系列 | 环境搭建、HarmonyOS应用开发及智能硬件开发
  19. c语言编程电机星三角启动,三相异步电动机星三角减压启动控制plc编程实例
  20. 新鲜新奇事物_用新鲜形容事物很新奇的句子

热门文章

  1. 社会化登录小结 (豆瓣为例)
  2. Mysql安装配置和Mysql使用六千字详解!!
  3. 9种在wpf/winForm等客户端集成Web网页方案详解,全网最全,快收藏!!
  4. 记一次electron开发桌面英语(自用,类歌词)
  5. 怎么在python官网下载python,官网python怎么下载安装
  6. 女生如何追男神(罗辑思维2014年第四期)——手抄版
  7. 波士顿动力人形机器人会后空翻了
  8. 如考华科计算机研究生调剂会到什么专业,2017年华中科技大学计算机学院考研调剂信息...
  9. android 360 悬浮窗口,Android实现类似360,QQ管家那样的悬浮窗
  10. easyui datagrid json分页实例