相信大家都在处理symbian中文显示的时候遇到了这种问题, 我现在就给总结一下这种问题的解决方法: 字符串编码中文表示常用的有:GB2312,GBK,Unicode,UTF-8 其中GBK是GB2312的超集,也就是涵盖了GB2312编码的所有内容, UTF-8是Unicode的在网络传输中的一种编码格式, 如果我们使用vc做为开发工具,在win下面进行开发,那么win 的默认字符集是 GBK的,而symbian系统默认的编码方式却是 Unicode,也就是说直接写在程序里面的汉字在手机上显示的时候, 就会变成乱码。 通常解决这个问题的方法有两种: (1)静态资源文件解决方案 (2)动态的调用字符集转换函数解决方案
对呀第一种解决方案来说,需要手工编辑rss文件,把汉字内容部分改为UTF-8格式, 在rss文件的末尾或者开头添加:CHARACTER_SET UTF8 即可 缺点是这种字符串一般针对静态资源,如果是那种随时根据数据变化更新汉字的情况 则需要考虑第二种情况
第二种情况动态转换字符集的方法 添加头文件 #include <charconv.h> // for char set convert GBK - Unicode 在mmp里面添加 LIBRARY charconv.lib // for GBK to Unicode converter
这两步完成后,重新编译;下面的这两个函数就可以用了。 void CMcAppUi::ConvGbk2Uni(TDesC8& original, TDes& res) { #ifndef __WINS__ 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; #else res.Format(_L("wayne len %d"), original.Length()) ; #endif }
void CMcAppUi::ConvUni2Gbk(TDesC& original, TDes8& res) { #ifndef __WINS__ TInt state=CCnvCharacterSetConverter::KStateDefault ; CCnvCharacterSetConverter* iConv ; iConv = CCnvCharacterSetConverter::NewLC(); if(iConv->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk, iEikonEnv->FsSession())!=CCnvCharacterSetConverter::EAvailable) User::Leave(KErrNotSupported); iConv->ConvertFromUnicode(res, original, state) ; CleanupStack::PopAndDestroy() ; #else res.Format(_L8("wayne chen %s"), original) ; #endif }
具体的使用方法: TBuf8<20> title8 ; TBuf<20> title16 ; TBuf8<20> msg8 ; TBuf<20> msg16 ; title8.Format(_L8("友情提示")) ; ConvGbk2Uni(title8, title16) ; msg8.Format(_L8(" 谢谢您的使用")) ; ConvGbk2Uni(msg8, msg16) ; ShowInfoDialog(title16, msg16) ; 即可,现在title16和msg16里面都存放的是16位的unicode中文字符串了, 可以直接显示了。 希望堆大家的开发有所帮助。 |