void FirstLetter(int nCode, char& strRet);
void GetFirstLetter(char* strName, char* strFirstLetter,int nLen)
{
unsigned char ucHigh, ucLow;
int nCode;
char strRet;
memset(strFirstLetter, 0, sizeof(nLen));
int i;
int len = 0;
for (i=0; i < (int)strlen(strName); i++)
{
if ((unsigned char)strName
continue;
ucHigh = (unsigned char)strName
ucLow = (unsigned char)strName
if ( ucHigh < 0xa1 || ucLow < 0xa1)
continue;
else
// Treat co
// so make following change to nCode.
nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
FirstLetter(nCode, strRet);
strFirstLetter[len] = strRet;
i++;
len++;
}
strFirstLetter[len] = 0;
}
void FirstLetter(int nCode, char& strLetter)
{
if(nCode >= 1601 && nCode < 1637) strLetter = 'A';
if(nCode >= 1637 && nCode < 1833) strLetter = 'B';
if(nCode >= 1833 && nCode < 2078) strLetter = 'C';
if(nCode >= 2078 && nCode < 2274) strLetter = 'D';
if(nCode >= 2274 && nCode < 2302) strLetter = 'E';
if(nCode >= 2302 && nCode < 2433) strLetter = 'F';
if(nCode >= 2433 && nCode < 2594) strLetter = 'G';
if(nCode >= 2594 && nCode < 2787) strLetter = 'H';
if(nCode >= 2787 && nCode < 3106) strLetter = 'J';
if(nCode >= 3106 && nCode < 3212) strLetter = 'K';
if(nCode >= 3212 && nCode < 3472) strLetter = 'L';
if(nCode >= 3472 && nCode < 3635) strLetter = 'M';
if(nCode >= 3635 && nCode < 3722) strLetter = 'N';
if(nCode >= 3722 && nCode < 3730) strLetter = 'O';
if(nCode >= 3730 && nCode < 3858) strLetter = 'P';
if(nCode >= 3858 && nCode < 4027) strLetter = 'Q';
if(nCode >= 4027 && nCode < 4086) strLetter = 'R';
if(nCode >= 4086 && nCode < 4390) strLetter = 'S';
if(nCode >= 4390 && nCode < 4558) strLetter = 'T';
if(nCode >= 4558 && nCode < 4684) strLetter = 'W';
if(nCode >= 4684 && nCode < 4925) strLetter = 'X';
if(nCode >= 4925 && nCode < 5249) strLetter = 'Y';
if(nCode >= 5249 && nCode < 5590) strLetter = 'Z';
}
int _tmain(int argc, _TCHAR* argv[])
{
char pTemp[] = "今天很开心";
char pTemp1[10];//保存汉字的首字母
GetFirstLetter(pTemp,pTemp1,10);
return 0;
}
附录1:汉字编码原则
1.国家标准汉字代码体系
的基础代码。
系列汉字信息处理方面的国家标准,今后将继续完善,并与国际上求得统一。
2. 国家标准汉字交换码
这种编码又称为国标码。在国标码的字符集中共收录了一级汉字3755个,二级汉字3008
个,图形符号682个,三项字符总计7445个。
方阵的每一行称为一个“区”,编号为01区到94区,每一列称为一个“位”,编号为01
位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯
数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码
就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一
的区位码。汉字“母”字的区位码是3624,表明它在方阵的36区24位,问号“?”的区
位码为0331,则它在03区3l位。
自定义符号区。
a—z各26个;
是按汉语拼音排序的,同音字按笔划顺序排序。其中55区的90一94位未定义汉字。
3. 国家标准汉字机内码
所述,汉字区位码的区码和位码的取值均在1~94之间,如直接用区位码作为机内码,就
会与基本ASCII码混淆。为了避免机内码与基本ASCII码的冲突,需要避开基本ASCII码
中的控制码(00H~1FH),还需与基本ASCII码中的字符相区别。为了实现这两点,可以
先在区码和位码分别加上20H,在此基础上再加80H(此处“H”表示前两位数字为十六
进制数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别
节和低位字节,这两位字节的机内码按如下规则表示:
的机内码的高位字节为B0H,低位字节为A1H,机内码就是B0A1H。
4. 汉字的输入码
键就直接输入了相应的字符或代码,“键入”和“输入”是同一个含义。但是在计算机上
进行汉字输入时,“键入”是指击键的动作即键盘操作的过程,而“输入”则是把所需的
汉字或字符送到指定的地方,是键盘操作的目的。目前已有多种汉字输入方法,因此就有
多种汉字输入码。汉字输入码是面向输入者的,使用不同的输入码其操作过程不同,但是
得到的结果是一样的。不管采用何种输入方法,所有输入的汉字都以机内码的形式存储在
介质中,而在进行汉字传输时,又都以交换码的形式发送和接收。
和输入码是一一对应的,具有标准的性质,它们编码用的字符是10个阿拉伯数字,每个
汉字的码长均为等长的四个数码。
的编码方案均有一定数量的重码。所谓重码即一码对应多字。有许多编码为了增加输入的
灵活性,同一汉字用多个码来对应,例如双音编码。
的编码,甚至使用者可以自行增加词汇库中的词汇,但在提高效率的同时也增加了记亿和
操作的复杂性。
果输入码和机内码存在简单的函数关系,有公式可以计算,如区位码等编码就不需要码表,
其他没有简单函数关系的编码就需要码表。码表大小与数据结构、单字数量、词汇数量等
因素有关。国标血2312—80规定的6763个一、二级汉字,备类编码的码表从几千字节到
几万字节。随着词汇旦的增加,有的码表达到了若干兆字节。
5. 汉字的点阵码
汉字的输出,就有不同的点阵字形。所谓汉字的点阵码,就是汉字点阵字形的代码。存储
在介质中的全部汉字的点阵码又称为字库。
位来表示,则每一行有16个二进制位,需用两个字节来存放每一行上的16个点,并且规
定其点阵中二进制位0为白点,1为黑点,这样一个16X16点阵的汉字需要用2×t6即32
个字节来存放。依次类推,24×24点阵和32×32点阵的汉字则依次要用72个字节和128
个字节存放一个汉字,构成它在字库中的字模信息。
在字库中的位置,再取出其字模信息作为字形在屏幕上显示或在打印机上打印输出。
#include "imm.h"
#pragma comment(lib,"imm32.lib")
CString GetChineseSpell(CString Chinese,CString IMEName=_T("微软拼音输入法 2007"))
{
if( Chinese.IsEmpty() ) return _T("");
HKL KL=NULL;
int nBuff=GetKeyboardLayoutList(0,NULL);
HKL* pKLList=new HKL[nBuff];
GetKeyboardLayoutList(nBuff,pKLList);
TCHAR* pIMEName;
int IMENameLen;
for(int i=0;i <nBuff;i++)
{
if(ImmIsIME(pKLList[i]))
{
if(IMENameLen=ImmGetDescription(pKLList[i],NULL,0))
{
pIMEName=new TCHAR[IMENameLen+1];
if(ImmGetDescription(pKLList[i],pIMEName,IMENameLen))
{
CString str;
str.Format(_T("%s"),pIMEName);
if(str.Find(IMEName)>=0)
{
KL=pKLList[i];
break;
}
}
delete[] pIMEName;
}
}
}
delete[] pKLList;
if(KL==NULL)
return _T(" <NO THE IME NAME>");
static CString retstr;
CANDIDATELIST* pCDL;
// if(BOOL IsDBCS=IsDBCSLeadByte(Chinese.GetAt(0)))
// {
if(LRESULT k=ImmEscape(KL,0,IME_ESC_MAX_KEY,NULL))
{
if(UINT len=ImmGetConversionList(KL,NULL,Chinese,NULL,0,GCL_REVERSECONVERSION))
{
pCDL=(CANDIDATELIST*)new BYTE[len];
if(UINT x=ImmGetConversionList(KL,NULL,Chinese,pCDL,len,GCL_REVERSECONVERSION))
retstr=(char*)pCDL->dwOffset+4;
else
retstr=_T(" <x==0>");
delete[] pCDL;
}
else retstr=_T(" <len==0>");
}
else return _T(" <k==0>");
// }
// else return _T(" <IsDBCS==FALSE>");
return retstr;
}