在symbian中显示中文

    技术2022-05-12  0

        中文字符编码常用的表示法有:GB2312,GBK,Unicode,UTF-8,其中GBK是GB2312的超集,也就是涵盖了GB2312编码的所有内容,UTF-8是Unicode的在网络传输中的一种编码格式,如果我们使用vc做为开发工具,在win下面进行开发,那么win的默认字符集是 GBK的,而symbian系统默认的编码方式却是Unicode,也就是说直接写在程序里面的汉字在手机上显示的时候,就会变成乱码。

     

    (1)静态资源文件解决方案 (2)动态的调用字符集转换函数解决方案

     

          对于第一种解决方案来说  

          首先,我们在rss文件的开头加入下面的这行代码     CHARACTER_SET UTF8   第二步,在资源文件中定义你需要的字符资源,如下     #define qtn_exam_caption "中文演示"      第三步,把编辑的这个文件保存为UTF8格式,这步很关键,否则你的程序显示可是乱码。   特别提示,把该资源文件保存UTF8无bom格式即可,如果保存为UTF8格式,这个文件的开头会加入3个字节的文件头,我们需要把这个loc文件用二进制的方式打开,把前3个字节的文件头删除掉,可以用vc6以二进制的方式打开进行前3个字节的删除或UE16进制打开,S60 3rd SDK下是必须要这么做的。   第四步,在rss定义字符串资源,如下     RESOURCE TBUF32 r_exam_caption { buf=qtn_title_main_view; }   最后,我们就可以在程序中使用中文了,使用方式如下:     HBufC* pFormat=StringLoader:oadLC(R_EXAM_CAPTION);     ... ... ...                    //现在就可以使用你的中文字符串的资源了     CleanupStack:opAndDestroy();  //使用后,别放了释放资源,否则会有内存泄露哦。

     

    第二种情况动态转换字符集的方法 添加头文件 #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中文字符串了.


    最新回复(0)