Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Symbian 关于字符编码转换

Symbian 关于字符编码转换

巴扎黑
巴扎黑asal
2016-12-20 14:51:451269semak imbas

字符串编码中文表示常用的有: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中文字符串了, 
可以直接显示了。

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn