`

symbian中文字符串显示问题的解决

阅读更多

 

symbian中文字符串显示问题的解决

相信大家都在处理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中文字符串了,

可以直接显示了。

希望堆大家的开发有所帮助。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics