• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            醬壇子

            專注C++技術(shù) 在這里寫下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評(píng)!!!)

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

            公告

            王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專業(yè)

            常用鏈接

            留言簿(19)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 387834
            • 排名 - 64

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            在windows下面編程,我們通常都知道unicode這個(gè)概念,如果一個(gè)程序是unicode的,那么他將調(diào)用

            unicode的api。這個(gè)時(shí)候,所有傳遞給api的字符串參數(shù)都要是unicode的.如果使用C的風(fēng)格,是很簡單的

            ,字符串全部由char* str 轉(zhuǎn)變成TCHAR* str,使用的crt函數(shù)(其實(shí)也是api)時(shí)調(diào)用_tcslen類的函數(shù)族就

            可以了。

            在討論其它問題前要先明確一個(gè)概念:unicode 與 utf-8編碼,utf-16編碼是兩個(gè)不同類別的術(shù)語。

            unicode對(duì)一個(gè)字符提供了一個(gè)唯一的編碼(參看下面的資料,關(guān)于UCS-2與UCS-4)
            假設(shè)"中"這個(gè)字符的編碼是0x34 0x34(我亂寫的),utf-8對(duì)其編碼,得到的是 0xE3 0x90 0xB6 需要3byte

            的空間進(jìn)行存儲(chǔ)。不同的unicode碼經(jīng)過utf-8編碼后會(huì)得到變長的結(jié)果.比如說'a'經(jīng)過utf-8編碼后得到

            的是和ascii碼相同,只占1個(gè)byte.對(duì)unicode使用不同的方法編碼,可以有效的節(jié)約存儲(chǔ)空間(如果選擇了

            錯(cuò)誤的編碼,會(huì)浪費(fèi)空間).

            中的unicode(UCS-2)值和編碼后的結(jié)果
            unicode???????????????????????????? utf-8??????????
            00110100 00110100????? 11100011? 10010000 10110110
            a的unicode值和編碼后的結(jié)果
            unicode???????????????????????????? utf-8
            00000000 01100001????? 01100001

            這里得出的結(jié)論是utf-8,utf-16編碼是在存儲(chǔ)字符串信息前的一個(gè)選擇,而不是處理字符串的選擇.


            OK,問題回到字符串編程上來。第一個(gè)問題,就是要選擇內(nèi)存中的字符串格式,包括自己所有需要傳遞字

            符串參數(shù)的函數(shù)的參數(shù)定義。我們這里有3個(gè)選擇,char*(ASCII string),unsigned short*(UCS2

            string,windows下的unicode),unsigned long*(UCS4 string,真正的unicode支持)。windows下的api是不

            支持UCS4的,所以在windows平臺(tái)下最好只做前2個(gè)的選擇。類似于windows的TCHAR定義,我們可以做這樣

            的定義
            #ifdef _UCS2
            #define TCHAR unsigned short
            #else
            #ifdef _UCS4
            #define TCHAR unsigned long
            #else
            #define TCHAR char
            #endif
            #endif
            然后有一個(gè)問題,如果在程序中需要使用一個(gè)預(yù)定義的字符串,比如說
            TCHAR* str = "中國";
            那么,str指向的常量字符串的編碼是ACSII string,還是UCS2 unicode string,還是UCS4 unicode

            string,是取決于編譯器的。這樣就容易造成許多不易發(fā)現(xiàn)的錯(cuò)誤。這里要推薦一個(gè)string table的概念

            ,用如下代碼替換。
            const TCHAR* str = StringTable::LoadStr(ID_HOMELOAD_NAME);
            StringTable類解析一個(gè)指定編碼的本地字符串表XML文件(可以用各種編碼存儲(chǔ)),這個(gè)文件可以使用自定

            義的工具或則是各種XML編輯工具來生成。使用StringTable::SetOutPutType(enum MemStrType)來使之在

            LoadStr的時(shí)候轉(zhuǎn)成各種字符串編碼。當(dāng)然,這個(gè)類中定義了一系列的編碼轉(zhuǎn)換函數(shù),比如說

            UTF8TOASCII,UTF8TOUCS2,UTF8TOUCS4,UCS4TOUCS2,UCS4TOASCII,UCS4TOXXX,StringTalbe內(nèi)部使用UCS4作

            為讀取后的字符串存儲(chǔ)格式,然后再根據(jù)StringTable::SetOutPutType指定的輸出類型生成相應(yīng)編碼的

            Table.這樣做的好處就是把這個(gè)編碼的問題重視化,即時(shí)出現(xiàn)編碼不一致的錯(cuò)誤,也能立刻修正。

            在linux下,系統(tǒng)對(duì)UCS4的支持比較好,#include<wchar.h>,里面的函數(shù)的接口都是ucs4 string.所以如果寫跨平臺(tái)程序,肯定是要用ucs2的(UCS4windows不支持,而且可以節(jié)約內(nèi)存,但是你的程序就不是真正的UNICODE3.1 Support了,而且也不能支持國家標(biāo)準(zhǔn)GB18030).然后再調(diào)用linux的相關(guān)函數(shù)時(shí),轉(zhuǎn)化為UCS4.參考文章http://www0.ccidnet.com/tech/os/2001/07/31/58_2811.html。我懶得寫了。



            Unicode 的定義
            Unicode 通常用作涉及雙字節(jié)字符編碼方案的通用術(shù)語。Unicode CCS 3.1 的官方稱謂是 ISO10646-1 通

            用多八字節(jié)編碼字符集(Universal Multiple Octet Coded Character Set,UCS)。Unicode 3.1 版本

            添加了 44,946 個(gè)新的編碼字符。算上 Unicode 3.0 版本已經(jīng)存在的 49,194 個(gè)字符,共計(jì) 94,140 個(gè)



            Unicode 編碼字符集利用了一個(gè)由 128 個(gè)三維的組構(gòu)成的四維編碼空間。其中每個(gè)組包含 256 個(gè)二維平

            面。每個(gè)平面由 256 個(gè)一維的行組成,并且每個(gè)行有 256 個(gè)單元。每個(gè)單元在這個(gè)編碼空間內(nèi)對(duì)一個(gè)字

            符編碼,或者被聲明為未經(jīng)使用。這種編碼概念被稱為 UCS-4;四個(gè)八位元用來表示指定組、平面、行和

            單元的每個(gè)字符。

            第一個(gè)平面(第 00 組的第 00 平面)是基本多語言平面(Basic Multilingual Plane,BMP)。BMP 按

            字母、音節(jié)、表意符號(hào)和各種符號(hào)及數(shù)字定義了常規(guī)使用的字符。后續(xù)的平面用于附加字符或其它還沒有

            發(fā)明的編碼實(shí)體。我們需要這完整的范圍去處理世界上的所有語言;特別是擁有將近 64,000 個(gè)字符的一

            些東亞語言。

            BMP 被用作雙字節(jié)的編碼字符集,這種編碼字符集確定為 ISO 10646 UCS-2 格式。ISO 10646 UCS-2 就

            是指 Unicode(并且兩者相同)。BMP,像所有 UCS 平面那樣,包含了 256 行,其中每行包含 256 個(gè)單

            元,字符僅僅按照 BMP 中的行和單元的八位元在單元中被編碼。 這就允許 16 位編碼字符能夠被用來書

            寫大多數(shù)商業(yè)上最重要的語言。UCS-2 不需要代碼頁切換、代碼擴(kuò)展或代碼狀態(tài)。UCS-2 是一種將

            Unicode 結(jié)合到軟件中的簡單方法,但它只限于支持 Unicode BMP。

            若要用 8 位字節(jié)表示一個(gè)多于 2^8 =256 個(gè)字符的字符編碼系統(tǒng)(character coding system,CCS),

            就需要一種字符編碼方案(character-encoding scheme,CES)。


            UTF-8
            UTF-8 轉(zhuǎn)換格式正逐步成為一種占主導(dǎo)地位的交換國際文本信息的方法,因?yàn)樗梢灾С质澜缟纤械恼Z

            言,而且它還與 ASCII 兼容。UTF-8 使用變長編碼。從 0 到 0x7f(127)的字符把自身編碼成單字節(jié),

            而將值更大的字符編碼成 2 到 6 個(gè)字節(jié)。

            表 1. UTF-8 編碼
            0x00000000 - 0x0000007F:? 0 xxxxxxx?
            0x00000080 - 0x000007FF:? 110 xxxxx10 xxxxxx?
            0x00000800 - 0x0000FFFF:? 1110 xxxx10 xxxxxx10 xxxxxx?
            0x00010000 - 0x001FFFFF:? 11110 xxx10 xxxxxx10 xxxxxx 10 xxxxxx?
            0x00200000 - 0x03FFFFFF:? 111110 xx10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx?
            0x04000000 - 0x7FFFFFFF:? 1111110 x10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx10 xxxxxx?
            posted on 2006-10-16 08:43 @王一偉 閱讀(2455) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 4. C++
            精品久久久久久国产潘金莲 | 欧洲精品久久久av无码电影| 亚洲精品美女久久777777| a级毛片无码兔费真人久久| 久久天天躁狠狠躁夜夜躁2O2O| 国产亚州精品女人久久久久久| 精品国产福利久久久| 久久精品人人做人人爽97| 久久久久久久久久久| 久久久久亚洲AV成人网人人软件| 99久久综合狠狠综合久久止| 色婷婷综合久久久中文字幕| 天天躁日日躁狠狠久久| 亚洲va久久久噜噜噜久久天堂| 香蕉99久久国产综合精品宅男自 | 久久久这里有精品| 69SEX久久精品国产麻豆| 亚洲精品美女久久777777| 亚洲精品美女久久久久99| 久久久久国产精品熟女影院| 久久久久无码精品国产不卡| 久久av无码专区亚洲av桃花岛| 奇米影视7777久久精品| 99久久er这里只有精品18| 久久91精品久久91综合| 午夜不卡888久久| 国产欧美久久久精品| 九九久久精品国产| 久久综合一区二区无码| 久久久久精品国产亚洲AV无码| 久久亚洲精精品中文字幕| 国产精品99久久久久久人| 久久精品国产99国产精品| 99蜜桃臀久久久欧美精品网站| 精品久久久久香蕉网| 人妻中文久久久久| 欧美va久久久噜噜噜久久| 青春久久| 人妻无码αv中文字幕久久琪琪布| 国产精品久久久久jk制服| 亚洲第一永久AV网站久久精品男人的天堂AV|