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

            Kisser Leon

            這個(gè)kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            unicode學(xué)習(xí)小結(jié)

            Posted on 2007-03-15 21:19 kk 閱讀(1539) 評論(1)  編輯 收藏 引用 所屬分類: IT

            學(xué)習(xí) unicode 也有一段時(shí)間了,雖然說沒有學(xué)得很好,但是卻是學(xué)到了許多東西啊,所以稍微小結(jié)一下,免得忘了,呵呵。很早就接觸過 unicode 這個(gè)詞了。不過以前太天真了,以為 unicode 是一件非常簡單的事情,很容易就解決了。只要用 TCHAR 代替 CHAR ,在所有的字符串前面加上 TEXT ,然后在 vc 里面 Preprocessor definitions 加上 _UNICODE UNICODE OK 了。實(shí)際上,僅僅這樣,還有很多疑惑不能解決。

            1、 Windows XP 完全使用 unicode 開發(fā),那為什么在 xp 下還會有亂碼呢?

            內(nèi)碼的存在,內(nèi)碼不兼容 unicode 。或者要解釋的不是unicode,而當(dāng)前不支持該編碼。

            2、 為什么有 UTF-8 16 32 ?為什么說 UTF-8 unicode 的呢? unicode 不都是 16 位的嗎?

            為了兼容現(xiàn)在的編碼。

            3、 codepage 是什么東西?為什么存在?

            4、 什么是國際化、本地化?為什么國際化、本地化那么困難?

            Locale 。舉個(gè)簡單的例子:不同地方的日期的顯示格式不同。

            5、 DBCS 是什么咚咚?它與 UTF-8 unicode 有什么聯(lián)系?

            UTF-8 是屬于 unicode 規(guī)范的,而 DBCS 不是。 UTF-8 是不定字節(jié)的(從一字節(jié)到六字節(jié)),而 DBCS 是雙字節(jié)的。 DBCS ASCII 同時(shí)存在來處理遠(yuǎn)東的一些字符(結(jié)合 codepage 來使用, GBK Big5 range 就有交錯(cuò)的),而 UTF-8 unicode 規(guī)范的實(shí)現(xiàn),它包含了所有的字符。從 Windows2K 開始,從 Windows 系統(tǒng)的底層實(shí)現(xiàn),已經(jīng)全面基于 Unicode ,同時(shí)仍保證完全兼容 ANSI/DBCS 程序。

            ?

            以下是對我這一階段學(xué)習(xí)的小結(jié):
            一、
            ????????????????????
            什么是 unicode

            Unicode provides a unique number for every character,
            no matter what the platform,
            no matter what the program,
            no matter what the language.

            歷史上有兩個(gè)組織想獨(dú)立創(chuàng)立單一字符集,一個(gè)是國際標(biāo)準(zhǔn)化組織( ISO )的 ISO 10646 ,另一個(gè)是由很多大企業(yè)( Apple Compaq HP IBM Microsoft Oracle 等)組成的協(xié)會組織的 unicode 1991 年前后,他們合并了雙方的工作,統(tǒng)一了編碼表。雖然這兩個(gè)組織都還獨(dú)立的存在,但是他們的標(biāo)準(zhǔn)是兼容的。

            Unicode 協(xié)會公布的 Unicode 標(biāo)準(zhǔn)嚴(yán)密地包含了 ISO 10646-1 實(shí)現(xiàn)級別 3 的基本多語言面。在兩個(gè)標(biāo)準(zhǔn)里所有的字符都在相同的位置并且有相同的名字。

            Unicode 標(biāo)準(zhǔn)額外定義了許多與字符有關(guān)的語義符號學(xué),一般而言是對于實(shí)現(xiàn)高質(zhì)量的印刷出版系統(tǒng)的更好的參考。 Unicode 詳細(xì)說明了繪制某些語言 ( 比如阿拉伯語 ) 表達(dá)形式的算法,處理雙向文字 ( 比如拉丁與希伯來文混合文字 ) 的算法和排序與字符串比較所需的算法,以及其他許多東西。

            另一方面 , ISO 10646 標(biāo)準(zhǔn) , 就象廣為人知的 ISO 8859 標(biāo)準(zhǔn)一樣 , 只不過是一個(gè)簡單的字符集表 . 它指定了一些與標(biāo)準(zhǔn)有關(guān)的術(shù)語 , 定義了一些編碼的別名 , 并包括了規(guī)范說明 , 指定了怎樣使用 UCS 連接其他 ISO 標(biāo)準(zhǔn)的實(shí)現(xiàn) , 比如 ISO 6429 ISO 2022. 還有一些與 ISO 緊密相關(guān)的 , 比如 ISO 14651 是關(guān)于 UCS 字符串排序的 .

            考慮到 Unicode 標(biāo)準(zhǔn)有一個(gè)易記的名字 , 且在任何好的書店里的 Addison-Wesley 里有 , 只花費(fèi) ISO 版本的一小部分 , 且包括更多的輔助信息 , 因而它成為使用廣泛得多的參考也就不足為奇了 .

            二、 ???????????????????? UTF-8 16 32

            UTF Unicode Transformation Format

            首先 UCS Unicode Char Set )和 Unicode 只是分配整數(shù)給字符的編碼表 . 現(xiàn)在存在好幾種將一串字符表示為一串字節(jié)的方法 . 最顯而易見的兩種方法是將 Unicode 文本存儲為 2 個(gè) 4 個(gè)字節(jié)序列的串 . 這兩種方法的正式名稱分別為 UCS-2 UTF-16 )和 UCS-4 UTF-32 . 除非另外指定 , 否則大多數(shù)的字節(jié)都是這樣的 (Bigendian convention). 將一個(gè) ASCII Latin-1 的文件轉(zhuǎn)換成 UCS-2 只需簡單地在每個(gè) ASCII 字節(jié)前插入 0x00. 如果要轉(zhuǎn)換成 UCS-4, 則必須在每個(gè) ASCII 字節(jié)前插入三個(gè) 0x00.

            Unix 下使用 UCS-2 ( UCS-4) 會導(dǎo)致非常嚴(yán)重的問題 . 用這些編碼的字符串會包含一些特殊的字符 , 比如 '\0' '/', 它們在 文件名和其他 C 庫函數(shù)參數(shù)里都有特別的含義 . 另外 , 大多數(shù)使用 ASCII 文件的 UNIX 下的工具 , 如果不進(jìn)行重大修改是無法讀取 16 位的字符的 . 基于這些原因 , 在文件名 , 文本文件 , 環(huán)境變量等地方 , UCS-2 不適合作為 Unicode 的外部編碼 .

            ISO 10646-1 Annex R RFC 2279 里定義的 UTF-8 編碼沒有這些問題 . 它是在 Unix 風(fēng)格的操作系統(tǒng)下使用 Unicode 的明顯的方法 .

            UTF-8 看起來不像是 unicode ,它只是作為一種過渡形態(tài)存在,作為新舊編碼之間交互的橋梁。雖然它是遵循 unicode 規(guī)范的,但它更像是 DBCS 的改善版,是一種 MBCS multi-byte char set )。顯然這個(gè)世界上不可能很快就完全 unicode UTF-8 還將會一直存在下去。 Window NT 操作系統(tǒng)的基本文本表示是 UTF-16 WCHAR 是其基本數(shù)據(jù)類型。

            UTF-8 以字節(jié)為編碼單元,沒有字節(jié)序的問題。 UTF-16 以兩個(gè)字節(jié)為編碼單元,在解釋一個(gè) UTF-16 文本前,首先要弄清楚每個(gè)編碼單元的字節(jié)序。 Unicode 規(guī)范使用 BOM Byte Order Mark )來標(biāo)記字節(jié)順序。在 UCS 編碼中有一個(gè)叫做“ ZERO WIDTH NO-BREAK SPACE ”的字符,它的編碼是 FEFF 。而 FFFE UCS 中是不存在的字符。所以,如果接收到 FEFF 就表明這個(gè)字節(jié)流是 Big-Endian 的;如果是 FFFE 則是 little endian UTF-8 不需要用 BOM 來表明字節(jié)序,但可以用 BOM 來表明編碼方式。 FEFF UTF-8 編碼是 EF BB BF

            以下就是 UTF-8 的模板

            0x0000 - 0x007F 用一個(gè)字節(jié)表示 0xxxxxxx

            0x0080 - 0x07FF 用兩個(gè)字節(jié)表示 110xxxxx 10xxxxxx

            0x0800 - 0xFFFF 用三個(gè)字節(jié)表示 1110xxxx 10xxxxxx 10xxxxxx

            舉個(gè)例子,如果你遇到了 11100110 10110001 10001001 01000001 這樣的字節(jié)流,首先你看第一個(gè)字節(jié)以 1110 開頭,即讀 3 個(gè)字節(jié)并按模板提取得到 0110 110001 001001( 去除模板標(biāo)志﹐再四字節(jié)四字節(jié)讀即 0x6c49) ,查 unicode 編碼表就是 " " , 而最后一個(gè)以 0 開頭就一定是一個(gè)字節(jié)了, 0x0041 ,也就是 "A"

            三、 ???????????????????? 字符集、字符編碼、內(nèi)碼

            字符必須編碼后才能被計(jì)算機(jī)處理。計(jì)算機(jī)使用的缺省編碼方式就是計(jì)算機(jī)的內(nèi)碼。像 ASCII GB2312 Big5 都是屬于字符編碼。當(dāng)然 UTF-8 16 也是一種字符編碼。而 unicode 則是一種規(guī)范。

            GB2312 是大陸的字符編碼標(biāo)準(zhǔn),屬于國家標(biāo)準(zhǔn)。它是與 ASCII 碼兼容的。后來又有 GBK1.0 GB18030 等字符編碼標(biāo)準(zhǔn),這些都是向下兼容的,但橫向不兼容!比如 GB2312 Big5 在很多編碼上是重疊的,是不兼容的; Unicode GB 標(biāo)準(zhǔn)碼也是不兼容的。中文操作系統(tǒng)的內(nèi)碼是 GBK 編碼。

            由于現(xiàn)有的大量程序和文檔都采用樂某種特定語言的編碼,例如 GBK windows 不可能不支持現(xiàn)有代碼,而全部采用 unicode !這就是為什么 windows 使用了內(nèi)碼機(jī)制。為了支持更多的地方語言文字, windows 還使用了 code page 機(jī)制以使 windows 能夠更方便的適應(yīng)不同地方的語言文字。 GBK 對應(yīng)的 code page CP936 windows 代碼頁只支持單字節(jié)和雙字節(jié)編碼的。

            GB2312-80 ,是中國大陸使用的國家標(biāo)準(zhǔn),其中一共編碼了 6763 個(gè)常用簡體漢字。 Big5 ,是臺灣使用的編碼標(biāo)準(zhǔn),編碼了中國臺灣使用的繁體漢字,大概有 8 千多個(gè)。 HKSCS ,是中國香港使用的編碼標(biāo)準(zhǔn),字體也是繁體,但跟 Big5 有所不同。

            四、 ???????????????????? VC 中的 Unicode 編程

            這個(gè)網(wǎng)上的資料有很多的,最重要的一個(gè)概念就是 T W _UNICODE UNICODE 等。這個(gè)理解起來感覺簡單很多,因?yàn)橹灰阍诔绦蛑卸际褂?/span> Unicode 就好了。數(shù)據(jù)的傳輸、數(shù)據(jù)的保存、數(shù)據(jù)的使用、轉(zhuǎn)化都使用 Unicode (目前基本上都是使用 UTF-8 比較多吧)。當(dāng)然了,這里肯定還是會有編碼格式轉(zhuǎn)化的問題的,比如輸入的不是 Unicode ,輸出的不能是 Unicode 等。但只要你在程序中都使用 Unicode 就解決問題了。是不是我想得太簡單了?

            ?

            上面這些東西,很多是我從網(wǎng)上摘抄下來的,也有少部分是我自己的理解。如果有什么不對的地方,敬請指教。如果有什么講的不清楚的、或者需要講一下的,請?zhí)岢鰜怼H绻惺裁聪M軌蛞黄鹩懻撚懻摰模瑲g迎給我發(fā)郵件或回帖討論!

            Feedback

            # re: unicode學(xué)習(xí)小結(jié)  回復(fù)  更多評論   

            2007-03-18 15:03 by 小熊
            Double-byte Character Sets
            A double-byte character set (DBCS), also known as an "expanded 8-bit character set", is an extended single-byte character set (SBCS), implemented as a code page. DBCSs were originally developed to extend the SBCS design to handle languages such as Japanese and Chinese. Some characters in a DBCS, including the digits and letters used for writing English, have single-byte code values. Other characters, such as Chinese ideographs or Japanese kanji, have double-byte code values. A DBCS can correspond either to a Windows code page or an OEM code page. A DBCS code page can also include a non-native code page, for example, an EBCDIC code page. For definitions of these code pages, see Code Pages.

            http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_9i79.asp

            from MSDN
            久久久久久精品免费看SSS| 人妻丰满AV无码久久不卡| 97久久久久人妻精品专区| 亚洲国产精品无码成人片久久| 久久久久久综合网天天| 国产成人精品久久| 精品久久久久久久无码| 久久精品国产一区| 欧美亚洲国产精品久久| 人妻无码久久一区二区三区免费| 久久婷婷国产麻豆91天堂| 亚洲&#228;v永久无码精品天堂久久 | 国产成人久久AV免费| 久久久久一本毛久久久| 亚洲国产精品无码成人片久久| 成人国内精品久久久久影院VR| 亚洲一级Av无码毛片久久精品| 99久久婷婷免费国产综合精品| 久久亚洲精品无码观看不卡| 久久精品嫩草影院| 无码人妻精品一区二区三区久久| 久久99国产精品成人欧美| 色婷婷综合久久久久中文一区二区| 久久国产综合精品五月天| 久久无码人妻一区二区三区| 久久综合五月丁香久久激情| 久久久精品午夜免费不卡| 欧美午夜精品久久久久免费视| 久久国产精品视频| 久久综合九色综合精品| 99国产欧美精品久久久蜜芽| 久久精品国产第一区二区三区| 国产精品久久久久蜜芽| 久久久久亚洲av成人无码电影| 九九久久99综合一区二区| 久久久久无码精品国产| 久久精品国产清自在天天线| 免费无码国产欧美久久18| 中文字幕无码久久人妻| 亚洲国产成人久久综合区| 久久这里有精品视频|