• 技术文章 >后端开发 >C#.Net教程

    Symbian 关于字符编码转换

    巴扎黑巴扎黑2016-12-20 14:51:45原创715

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:避免六个常见的开发错误 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • go是c语言中关键字吗• 指针数组和数组指针的区别是什么• putchar()的功能是啥• 汇编语言和c语言的区别是什么• c语言文件读写怎么操作
    1/1

    PHP中文网