这几天,帮一个学长一起弄毕业设计,关于实现一个5110的内嵌中文字库,其中需要写一个VC窗口,说简单点就是输入一个汉字,获取它的内码,涉及到了汉字编码问题。
先说说汉字内码,汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操 作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机 器内部都要转换成机内码,才能被存储和进行各种处理。
汉字在计算机内部其内码是唯一的。因为汉字处理系统要保证中西文的兼容,当系统中同时存在ASCII码和汉字国标码时,将会产生二义性。例如:有两个字节的内容为30H和21H,它既可表示汉字“啊”的国标码,又可表示西文“0”和“!”的ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。
GB码的机内码为二字节长的代码,它是在相应GB码的每个字节最高位上加“1”,即汉字机内码=汉字国标码+8080H。例如,上述“啊”字的国标码是3021H,其汉字机内码则是B0A1H。
原理讲完了,这个VC程序怎么实现呢?
很简单,分别取出区码和位码,注意调换一下位置就可以了。
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch(id) { case IDC_OK: TCHAR ps[256]; TCHAR name2[256]; unsigned short int tmp; TCHAR t; GetDlgItemText(hwnd, IDC_EDIT1, ps, sizeof(ps)); t=*ps; *ps=*(ps+1); *(ps+1)=t; tmp=*(short int*)ps; itoa(tmp,name2,16); //wsprintf(name2, "%d", tmp); SetDlgItemText(hwnd, IDC_EDIT2, name2); break; default: break; } }
------------------------------------------------------------------------------------------------------------------
作者:庞辉
出处:http://www.cnblogs.com/pang123hui/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名庞辉(包含链接).