前段时间在搞一个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[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[] 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以及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之间的转换代码就不好放在这上面了,如果需要这方面资料的朋友,可以留下邮件沟通。
评论