导读:
Author: lixiaosan
Date: 05/26/2006
/********************************************************************************************
/* Syntax
/* GetFirstLetter(CString strName, CString& strFirstLetter)
/* Remarks:
/* Get the first letter of pinyin according to specified Chinese character.
/* Parameters:
/* strName - a CString object that is to be parsed.
/* strFirstLetter - a CString object that is to receive the string of the first letter.
/* Return Values:
/* None.
/* Author:
/* lixiaosan
/* Create Date:
/* 05-26-2006
/********************************************************************************************
void GetFirstLetter(CString strName, CString& strFirstLetter)
{
TBYTE ucHigh, ucLow;
int nCode;
CString strRet;
strFirstLetter.Empty();
for (int i=0; i {
if ( (TBYTE)strName[i] < 0x80 )
continue;
ucHigh = (TBYTE)strName[i];
ucLow = (TBYTE)strName[i+1];
if ( ucHigh < 0xa1 || ucLow < 0xa1)
continue;
else
// Treat code by section-position as an int type parameter,
// so make following change to nCode.
nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
FirstLetter(nCode, strRet);
strFirstLetter += strRet;
i++;
}
}
/********************************************************************************************
/* Syntax
/* void FirstLetter(int nCode, CString& strLetter)
/* Remarks:
/* Get the first letter of pinyin according to specified Chinese character code.
/* Parameters:
/* nCode - the code of the chinese character.
/* strLetter - a CString object that is to receive the string of the first letter.
/* Return Values:
/* None.
/* Author:
/* lixiaosan
/* Create Date:
/* 05-26-2006
/********************************************************************************************
void FirstLetter(int nCode, CString& strLetter)
{
if(nCode >= 1601 && nCode < 1637) strLetter = _T("A");
if(nCode >= 1637 && nCode < 1833) strLetter = _T("B");
if(nCode >= 1833 && nCode < 2078) strLetter = _T("C");
if(nCode >= 2078 && nCode < 2274) strLetter = _T("D");
if(nCode >= 2274 && nCode < 2302) strLetter = _T("E");
if(nCode >= 2302 && nCode < 2433) strLetter = _T("F");
if(nCode >= 2433 && nCode < 2594) strLetter = _T("G");
if(nCode >= 2594 && nCode < 2787) strLetter = _T("H");
if(nCode >= 2787 && nCode < 3106) strLetter = _T("J");
if(nCode >= 3106 && nCode < 3212) strLetter = _T("K");
if(nCode >= 3212 && nCode < 3472) strLetter = _T("L");
if(nCode >= 3472 && nCode < 3635) strLetter = _T("M");
if(nCode >= 3635 && nCode < 3722) strLetter = _T("N");
if(nCode >= 3722 && nCode < 3730) strLetter = _T("O");
if(nCode >= 3730 && nCode < 3858) strLetter = _T("P");
if(nCode >= 3858 && nCode < 4027) strLetter = _T("Q");
if(nCode >= 4027 && nCode < 4086) strLetter = _T("R");
if(nCode >= 4086 && nCode < 4390) strLetter = _T("S");
if(nCode >= 4390 && nCode < 4558) strLetter = _T("T");
if(nCode >= 4558 && nCode < 4684) strLetter = _T("W");
if(nCode >= 4684 && nCode < 4925) strLetter = _T("X");
if(nCode >= 4925 && nCode < 5249) strLetter = _T("Y");
if(nCode >= 5249 && nCode < 5590) strLetter = _T("Z");
}
How to use:
CString strName, strRes;
strName = _T("A李小三");
GetFirstLetter(strName, strRes);
//Then the value of strRes is "LXS".
附录1:汉字编码原则
1.国家标准汉字代码体系
汉字字数繁多,属性丰富,因而汉字代码体系也较复杂,包括:
(1)汉字机内码。它们是汉字在计算机汉字系统内部的表示方法,是计算机汉字系统
的基础代码。
(2)汉字交换码。它们是国标汉字(如机内码)进行信息交换的代码标准。
(3)汉字输入码。它们是在计算机标准键盘上输入汉字用到的各种代码体系。
(4)汉字点阵码。它们是在计算机屏幕上显示和在打印机上打印输出汉字的代码体系。
(5)汉字字形控制码。为了打印各种风格的字体和字形所制定的代码。
这些代码系统有的必须有统一的国家标准,有的则不要求统一。近年来我国已经制定
系列汉字信息处理方面的国家标准,今后将继续完善,并与国际上求得统一。
2. 国家标准汉字交换码
我国制定了“中华人民共和国国家标准信息交换汉字编码”,标准代号为GB2312—80,
这种编码又称为国标码。在国标码的字符集中共收录了一级汉字3755个,二级汉字3008
个,图形符号682个,三项字符总计7445个。
在国标GD2312—80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,
方阵的每一行称为一个“区”,编号为01区到94区,每一列称为一个“位”,编号为01
位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯
数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码
就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一
的区位码。汉字“母”字的区位码是3624,表明它在方阵的36区24位,问号“?”的区
位码为0331,则它在03区3l位。
所有的汉字和符号所在的区分为以下四个组:
(1)01区到15区。图形符号区,其中01区到09区为标准符号区,10区到15区为
自定义符号区。
01区到09区的具体内容如下;
1)01区。一般符号202个,如间隔符、标点、运算符、单位符号及制表符;
2)02区。序号60个,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
3)03区。数字22个,如0—9及X一XII,英文字母52个,其中大写A—Z、小写
a—z各26个;
4)04区。日文平假名83个;
5)05区。日文片假名86个;
6)06区。希腊字母48个;
7)07区。俄文字母66个;
8)08区。汉语拼音符号a—z26个;
9)09区。汉语拼音字母37个。
(2)16区到55区。一级常用汉字区,包括了3755个一统汉字。这40个区中的汉字
是按汉语拼音排序的,同音字按笔划顺序排序。其中55区的90一94位未定义汉字。
(3)56区到87区。二级汉字区,包括了3008个二级汉字,按部首排序。
(4)88区到94区。自定义汉字区。
第10区到第15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自行
定义国标码中未定义的符号和汉字。
3. 国家标准汉字机内码
汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上
所述,汉字区位码的区码和位码的取值均在1~9
Author: lixiaosan
Date: 05/26/2006
/********************************************************************************************
/* Syntax
/* GetFirstLetter(CString strName, CString& strFirstLetter)
/* Remarks:
/* Get the first letter of pinyin according to specified Chinese character.
/* Parameters:
/* strName - a CString object that is to be parsed.
/* strFirstLetter - a CString object that is to receive the string of the first letter.
/* Return Values:
/* None.
/* Author:
/* lixiaosan
/* Create Date:
/* 05-26-2006
/********************************************************************************************
void GetFirstLetter(CString strName, CString& strFirstLetter)
{
TBYTE ucHigh, ucLow;
int nCode;
CString strRet;
strFirstLetter.Empty();
for (int i=0; i {
if ( (TBYTE)strName[i] < 0x80 )
continue;
ucHigh = (TBYTE)strName[i];
ucLow = (TBYTE)strName[i+1];
if ( ucHigh < 0xa1 || ucLow < 0xa1)
continue;
else
// Treat code by section-position as an int type parameter,
// so make following change to nCode.
nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
FirstLetter(nCode, strRet);
strFirstLetter += strRet;
i++;
}
}
/********************************************************************************************
/* Syntax
/* void FirstLetter(int nCode, CString& strLetter)
/* Remarks:
/* Get the first letter of pinyin according to specified Chinese character code.
/* Parameters:
/* nCode - the code of the chinese character.
/* strLetter - a CString object that is to receive the string of the first letter.
/* Return Values:
/* None.
/* Author:
/* lixiaosan
/* Create Date:
/* 05-26-2006
/********************************************************************************************
void FirstLetter(int nCode, CString& strLetter)
{
if(nCode >= 1601 && nCode < 1637) strLetter = _T("A");
if(nCode >= 1637 && nCode < 1833) strLetter = _T("B");
if(nCode >= 1833 && nCode < 2078) strLetter = _T("C");
if(nCode >= 2078 && nCode < 2274) strLetter = _T("D");
if(nCode >= 2274 && nCode < 2302) strLetter = _T("E");
if(nCode >= 2302 && nCode < 2433) strLetter = _T("F");
if(nCode >= 2433 && nCode < 2594) strLetter = _T("G");
if(nCode >= 2594 && nCode < 2787) strLetter = _T("H");
if(nCode >= 2787 && nCode < 3106) strLetter = _T("J");
if(nCode >= 3106 && nCode < 3212) strLetter = _T("K");
if(nCode >= 3212 && nCode < 3472) strLetter = _T("L");
if(nCode >= 3472 && nCode < 3635) strLetter = _T("M");
if(nCode >= 3635 && nCode < 3722) strLetter = _T("N");
if(nCode >= 3722 && nCode < 3730) strLetter = _T("O");
if(nCode >= 3730 && nCode < 3858) strLetter = _T("P");
if(nCode >= 3858 && nCode < 4027) strLetter = _T("Q");
if(nCode >= 4027 && nCode < 4086) strLetter = _T("R");
if(nCode >= 4086 && nCode < 4390) strLetter = _T("S");
if(nCode >= 4390 && nCode < 4558) strLetter = _T("T");
if(nCode >= 4558 && nCode < 4684) strLetter = _T("W");
if(nCode >= 4684 && nCode < 4925) strLetter = _T("X");
if(nCode >= 4925 && nCode < 5249) strLetter = _T("Y");
if(nCode >= 5249 && nCode < 5590) strLetter = _T("Z");
}
How to use:
CString strName, strRes;
strName = _T("A李小三");
GetFirstLetter(strName, strRes);
//Then the value of strRes is "LXS".
附录1:汉字编码原则
1.国家标准汉字代码体系
汉字字数繁多,属性丰富,因而汉字代码体系也较复杂,包括:
(1)汉字机内码。它们是汉字在计算机汉字系统内部的表示方法,是计算机汉字系统
的基础代码。
(2)汉字交换码。它们是国标汉字(如机内码)进行信息交换的代码标准。
(3)汉字输入码。它们是在计算机标准键盘上输入汉字用到的各种代码体系。
(4)汉字点阵码。它们是在计算机屏幕上显示和在打印机上打印输出汉字的代码体系。
(5)汉字字形控制码。为了打印各种风格的字体和字形所制定的代码。
这些代码系统有的必须有统一的国家标准,有的则不要求统一。近年来我国已经制定
系列汉字信息处理方面的国家标准,今后将继续完善,并与国际上求得统一。
2. 国家标准汉字交换码
我国制定了“中华人民共和国国家标准信息交换汉字编码”,标准代号为GB2312—80,
这种编码又称为国标码。在国标码的字符集中共收录了一级汉字3755个,二级汉字3008
个,图形符号682个,三项字符总计7445个。
在国标GD2312—80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,
方阵的每一行称为一个“区”,编号为01区到94区,每一列称为一个“位”,编号为01
位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯
数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码
就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一
的区位码。汉字“母”字的区位码是3624,表明它在方阵的36区24位,问号“?”的区
位码为0331,则它在03区3l位。
所有的汉字和符号所在的区分为以下四个组:
(1)01区到15区。图形符号区,其中01区到09区为标准符号区,10区到15区为
自定义符号区。
01区到09区的具体内容如下;
1)01区。一般符号202个,如间隔符、标点、运算符、单位符号及制表符;
2)02区。序号60个,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
3)03区。数字22个,如0—9及X一XII,英文字母52个,其中大写A—Z、小写
a—z各26个;
4)04区。日文平假名83个;
5)05区。日文片假名86个;
6)06区。希腊字母48个;
7)07区。俄文字母66个;
8)08区。汉语拼音符号a—z26个;
9)09区。汉语拼音字母37个。
(2)16区到55区。一级常用汉字区,包括了3755个一统汉字。这40个区中的汉字
是按汉语拼音排序的,同音字按笔划顺序排序。其中55区的90一94位未定义汉字。
(3)56区到87区。二级汉字区,包括了3008个二级汉字,按部首排序。
(4)88区到94区。自定义汉字区。
第10区到第15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自行
定义国标码中未定义的符号和汉字。
3. 国家标准汉字机内码
汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上
所述,汉字区位码的区码和位码的取值均在1~9