• <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ì)

            搜索

            •  

            積分與排名

            • 積分 - 387109
            • 排名 - 64

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

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

            ,字符串全部由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ì)得到變長(zhǎng)的結(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 = "中國(guó)";
            那么,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了,而且也不能支持國(guó)家標(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é)合到軟件中的簡(jiǎn)單方法,但它只限于支持 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)地位的交換國(guó)際文本信息的方法,因?yàn)樗梢灾С质澜缟纤械恼Z

            言,而且它還與 ASCII 兼容。UTF-8 使用變長(zhǎng)編碼。從 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 @王一偉 閱讀(2445) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 4. C++
            99久久精品免费看国产一区二区三区 | 国内精品久久久久伊人av| 精品久久久久久无码免费| Xx性欧美肥妇精品久久久久久| 精品久久久久香蕉网| 国产成人精品白浆久久69| 天天久久狠狠色综合| 久久WWW免费人成—看片| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久免费看黄a级毛片| 伊人久久大香线蕉综合热线| 国内精品久久久久影院亚洲| 欧美日韩久久中文字幕| 久久丫精品国产亚洲av不卡| 国产一区二区精品久久| 久久一区二区免费播放| 精品久久久久久无码专区不卡| 久久久久综合网久久| 亚洲国产成人精品91久久久| 99久久精品国产高清一区二区 | 久久久久夜夜夜精品国产| 精品久久久久成人码免费动漫| 精品久久久久久无码专区| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久久免费观成人影院| 影音先锋女人AV鲁色资源网久久| 久久er99热精品一区二区| 久久久久久久91精品免费观看| 久久精品中文闷骚内射| AV无码久久久久不卡蜜桃| 久久伊人中文无码| 久久久久亚洲av无码专区导航 | a级毛片无码兔费真人久久| 久久精品一区二区国产| 亚洲AV无一区二区三区久久| 色综合合久久天天综合绕视看| 天堂久久天堂AV色综合 | 精品综合久久久久久888蜜芽| 伊人久久大香线蕉综合5g| 国产毛片久久久久久国产毛片| 久久亚洲欧美日本精品|