zoukankan      html  css  js  c++  java
  • unicode 字符串转成 TDesC转贴

     unicode 字符串转成 TDesC

      所有描述符,其实都不是真实的类,而是一个typedef。在非内核模式的时候,所有的描述符,如TDesC,其真实的实现是TDesC16,在内核模式的时候,则是TDesC8。还是看名取义,带8的是单字符1个字节的描述符,带16的是宽字符2字节的描述符。在非内核态的时候,统一使用16位的描述符作为默认值,是为了兼容unicode编码,帮助在不同语言下进行开发。大部分的系统API,提供的都是接受TDesC这样typedef的接口,其实也就是unicode-16的16位描述符。但在一些io相关的接口,都是接受8结尾的单字符描述符,以兼容不同的数据格式。单字符描述符通常不会对编码有任何约束,可以是二进制流,可以是utf-8,可以是一般的ascii码。具体是什么,逻辑需要调用者自己来维护。为了将io读入的数据传递给一些系统API,往往就需要将8位描述符转成16位描述符。这种转换和编码有密切联系,如果只是一般的ascii串(或者其他编码的ascii部分...),可以使用TDes的Copy接口,从8位拷贝到16位,或者从16位拷贝到8位。从8位拷贝的16位,第一个字节填充对应的8位字符的内容,第二个字节填充的是'\0',就是全部为0。而从16位到8位,可想而知,后一个字节的内容被截取抛弃。但如果是一些复杂的编码转换,比如utf-8的字符流转成系统所需的unicode-16,那么就需要用到CnvUtfConverter,它负责在不同的字符集中做转换。

      其他字符类型类

      看到Symbian的描述符,最疑惑的不仅仅是那套复杂的继承体系,还有_L和_LIT这样的宏。打开_LIT这个宏,你可以看到,它其实就是定义一个TLitC类型的const static常量字符串。从意义上来说,通过_LIT,可以将一些常用的字符串作为常量存在,使其不会反复构造和析构,是空间换时间的策略;从接口上看,它重载了很多转型运算符operator (),可以转身成为TDesC的各个版本,与该继承体系兼容;而从内存实现上来看,它存放的是:C++字符串的长度(除\0) + 原汁原味的C++字符串(就是\0结尾的一坨short int或者char数组...),通过这样的结构,一方面可以和Symbian的描述符表示相一致,又可以享用C++的原始支持,一举两得。

      相比_LIT的华丽,_L这个宏就土鳖不少,代表了旧生产力的落后。它其实,就是定义一个TPtrC,TPtrC中的内容指向了一个常量的数组(typedef后叫做TText...),这个常量数组,其实就是有一个char或short int的数组转型而成,也是原汁原味的C++字符串。从本质上来看,TPtrC扮演这个角色,完全是在人手短缺时的友情客串,它本不应该来做这件事情,因为其内部是通过一个指针来指向真实的字符空间,很多操作都经过多一次的取址操作,降低了效率;而TLexC,则是量身打造精心包装天生大明星,它优化掉了那个作梗的指针,提高了效率。所以摒弃_L,拥抱_LIT,是所有Symbian教学都会呼吁的内容,还是合情合理的。。。

      还有一个常用的和字符串相关联的东西,就是TLex类。它做的工作,就是大名鼎鼎的string-parsing。给它一个描述符,它可以还你一个整形数抑或是浮点数。TLex对数的解析,本质上还是基于ascii编码的,你给它的描述符编码,需要兼容ascii标准,不要拿个全角的数字为难它,它会罢工。

    refer to: http://tech.ddvip.com/2009-05/1243588855121469_3.html
  • 相关阅读:
    rabbitmq技术的一些感悟(一)
    用python做自己主动化測试--对server端的自己主动化測试(3)-很多其它http client实例
    huffman编码——原理与实现
    MS-SQLSERVER中的MSDTC不可用解决方法
    基础总结篇之中的一个:Activity生命周期
    STL vector使用方法介绍
    Cocos2d-x Render-NewCulling
    C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
    shell编程基础
    软考复习之路—组成原理
  • 原文地址:https://www.cnblogs.com/zziss/p/1780273.html
Copyright © 2011-2022 走看看