unicode 字符串转成 TDesC-转贴
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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
                        
                        
                        所有描述符,其實都不是真實的類,而是一個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
轉載于:https://www.cnblogs.com/zziss/archive/2010/07/18/1780273.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的unicode 字符串转成 TDesC-转贴的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 功耗降低50% 三星第二代3nm已有手机
- 下一篇: As3.0与java数据类型的比较总结
