• <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++
            久久夜色精品国产噜噜亚洲a| 久久婷婷五月综合色高清| 亚洲精品乱码久久久久久按摩| 国产成人精品久久亚洲高清不卡| 91视频国产91久久久| 精品熟女少妇a∨免费久久| 久久久一本精品99久久精品66| 久久亚洲国产精品成人AV秋霞| 欧美国产成人久久精品| 日韩久久久久久中文人妻| 亚洲愉拍99热成人精品热久久| 精品国产日韩久久亚洲| 久久人人添人人爽添人人片牛牛| 亚洲国产精品无码久久久蜜芽| 久久精品午夜一区二区福利| 国产精品9999久久久久| 99久久精品免费看国产一区二区三区 | 久久精品无码一区二区app| 久久久不卡国产精品一区二区| 最新久久免费视频| 亚洲色大成网站www久久九| 精品午夜久久福利大片| 久久久久无码精品| 亚洲AV无码久久| 99久久免费只有精品国产| 性欧美大战久久久久久久| 亚洲成色www久久网站夜月| 国产精品久久久久久福利漫画| 久久婷婷人人澡人人| 久久精品九九亚洲精品| 久久影视综合亚洲| 国产产无码乱码精品久久鸭| 久久综合精品国产一区二区三区| 久久久久久久久久久| 国内精品久久久久国产盗摄| 久久久久亚洲av成人网人人软件| 国产一级做a爰片久久毛片| 久久久久亚洲av成人无码电影| 欧美亚洲色综久久精品国产| 久久中文精品无码中文字幕| 久久精品国产亚洲AV电影|