前段时间在搞一个GB18030字体相关的项目,发现其中的猫腻还不少,现将这段时间的心得体会以及相关收获与大家分享。 一 GB18030的显示 目前,Windows系统还不支持四字节编码的文字显示,针对中文GB18030四字节编码,Windows系统特别推出了一个GB18030包,下载地址为: http://www.microsoft.com/china/windows2000/downloads/18030.mspx 在开发包中,主要包括以下四个东西,只要安装了以后就自动会有的,前两个在C盘的Windows下,后两个在C盘 Program Files文件夹下。 · 字体文件 SimSun18030.ttc · 代码页支持文件 c_g18030.dll · 转换工具gbunicnv.exe · 微软4字节字符集编码支持包ms4bsp.dll 装好后,修改注册表信息,找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink],然后在 “Tahoma” 和 “SimSun”加入SimSun18030.ttc,SimSun-18030。 一切搞定后,重启机器,这样系统就支持GB18030的显示了。 为了方便大家学习,现将参考代码显示在下面: void CMy4ByteCodeDlg::OnBnClickedOk() { CByte4Code* pByte4Code = new CByte4Code(); char* pCode = new char[5]; wchar_t* pWCode = new wchar_t[2]; pCode[0] = 0x82; pCode[1] = 0x34; pCode[2] = 0xFC; pCode[3] = 0x36; pCode[4] = '\0'; pByte4Code->CodeTransfer( pCode, pWCode ); CDC* pDC = GetDC(); RECT *lprc = new RECT(); CFont font,*pOldFont; LOGFONT logFont = { 0 }; logFont.lfHeight = 50; logFont.lfCharSet = CHINESEBIG5_CHARSET; wcscpy(logFont.lfFaceName, _T("黑体") ); font.CreateFontIndirect(&logFont); pOldFont = pDC->SelectObject(&font); pDC->GetWindow()->GetClientRect(lprc); ExtTextOutW( pDC->GetSafeHdc(), 0, 0, ETO_OPAQUE, lprc, pWCode, 1, NULL ); pDC->SelectObject(pOldFont); delete pByte4Code; delete[] pCode; delete[] pWCode; delete lprc; } bool CByte4Code::CodeTransfer( const char* pCode, wchar_t* pCodeResult ){ int nSize = 0; if( pCode == NULL ) return false; if( !IsValidCodePage( 54936 ) ) return false; nSize = MultiByteToWideChar( 54936, 0, pCode, -1, NULL, 0 ); if( nSize == MultiByteToWideChar( 54936, 0, pCode, -1, pCodeResult, nSize )) { pCodeResult[1] = '\0'; return true; } else return false;} 二 GB18030和Unicode码之间的转换 GB18030中二字节汉字的编码和Unicode码之间的映射没有什么规律可寻,所以一般都用查表的办法,在这里我主要是先从网上下载一个GB18030和Unicode码的对应表,然后在程序中建立一个映射词典,然后通过外部输入进行查询。对于GB18030四字节汉字和Unicode码之间是否存在规律性的映射,我在网上查询过一些文章,有的说有明显的映射关系,也有说没有明显映射关系,个人觉得没有明显的映射规律,所以我在处理它们之间的转换的时候,还是用查表法。 下面是一篇关于介绍GB18030和Unicode以及GBK的文章,从文章中可以下载GB18030和 Unicode码以及它们的对应关系。这篇文章些的非常好,很有必要看看: http://www.cnblogs.com/hunter_gio/archive/2008/04/24/1168863.html 此外,北大中文论坛也是一个研究字符编码和中文信息处理的人必须去的一个地方,里面有很多很好的信息。 http://www.pkucn.com/,进它的中文信息处理板块。 我所完成的代码主要功能是,输入一个GB18030码,可以显示它对应的Unicode码以及它所对应的字。输入一个Unicode码,可以显示它所对应的GB18030码以及它所对应的字。 由于不知道怎么在这上面放附件,所以GB18030和Unicode之间的转换代码就不好放在这上面了,如果需要这方面资料的朋友,可以留下邮件沟通。

评论