最近做项目,遇到一个 Symbian 中显示中文的问题,由于是刚开始接触 Symbian,遇到了很多困难,对于这个很基本的问题,借鉴了网上的一些方法最终还是解决了,现总结如下。
中文字符编码常用的表示法有:GB2312,GBK,Unicode,UTF-8,其中GBK是GB2312的超集,也就是涵盖了GB2312编码的所有内容,UTF-8是 Unicode的在网络传输中的一种编码格式,如果我们使用vc做为开发工具,在win下面进行开发,那么win的默认字符集是 GBK的,而symbian系统默认的编码方式却是Unicode,也就是说直接写在程序里面的汉字在手机上显示的时候,就会变成乱码。
void CECommerceRestaurantContainer::ConvGbk2Uni(TDesC8& original, TDes& res)
{
RFs aFileServerSession;
aFileServerSession.Connect();
CCnvCharacterSetConverter* converter = CCnvCharacterSetConverter::NewLC();
if (converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,
aFileServerSession) != CCnvCharacterSetConverter::EAvailable)
User::Leave(KErrNotSupported);
TInt state = CCnvCharacterSetConverter::KStateDefault;
TPtrC8 str(original);
HBufC* iInfoText = HBufC::NewL(str.Length());
TPtr16 ptr = iInfoText->Des();
if (CCnvCharacterSetConverter::EErrorIllFormedInput
== converter->ConvertToUnicode(ptr, str, state))
User::Leave(KErrArgument);
res.Zero();
res.Copy(ptr);
aFileServerSession.Close();
CleanupStack::PopAndDestroy();
delete iInfoText;
}
现在title16和msg16里面都存放的是16位的unicode中文字符串了.
下面是我在 Draw()函数中实现的显示代码:
void CECommerceRestaurantContainer::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
const CFont* myFont = NULL;
//myFont = LatinPlain12();
//myFont = LatinBold12();
//gc.UseFont(iEikonEnv->AnnotationFont());
myFont = ApacPlain16();
gc.UseFont(myFont);
gc.SetPenColor(KRgbYellow);
TBuf8<20> title8;
TBuf<20> title16;
TBuf8<20> msg8;
TBuf<20> msg16;
title8.Format(_L8("友情提示"));
ConvGbk2Uni(title8, title16);
msg8.Format(_L8(" 谢谢您的使用"));
ConvGbk2Uni(msg8, msg16);
gc.DrawText(title16, TPoint(50, 100));
gc.DrawText(msg16, TPoint(50, 50));
gc.DiscardFont();
}
开始始终显示不出中文,出现的只是好几个小方框,检查了好几遍代码还是没发现有什么错误,后来发现问题出在了 Symbian 的 sdk 中,默认状态下 Symbian 用的语言是英文,要想显示中文要换成 Chinese。
方法:开始—>程序—>S60 developer Tools —>3rd edition SDK —>1.0 —> languages —>Change to Chinese 这样就可以了。
希望能与大家多交流学习,请多指教!