Symbian 关于字符编码转换

巴扎黑
发布: 2016-12-20 14:51:45
原创
1266 人浏览过

字符串编码中文表示常用的有: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   即可 
缺点是这种字符串一般针对静态资源,如果是那种随时根据数据变化更新汉字的情况 
则需要考虑第二种情况 

第二种情况动态转换字符集的方法 

常使用CCnvCharacterSetConverter和CnvUtfConverter这两个类进行转化成Symbian系统认识的Unicode编码. 

CCnvCharacterSetConverter类可以进行Symbian支持的所有编码转换 

CnvUtfConverter这个类常UTF-8与Unicode 和UTF-7与Unicode之间的相互转换 


添加头文件 
#include         //  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中文字符串了, 
可以直接显示了。

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!