全部評(píng)論(1條)
-
- 微信a1563326 2017-09-20 23:57:26
- 搞清常用編碼特性是解決字符集編碼問題的基礎(chǔ)。字符集編碼的識(shí)別與轉(zhuǎn)換、分析各種亂碼產(chǎn)生的原因、編程操作各種編碼字符串(例如字符數(shù)計(jì)算、截?cái)嗵幚恚┑榷夹枰宄幋a的特性。 了解一種字符集編碼主要是要了解該編碼的編碼范圍,編碼對(duì)應(yīng)的字符集(都包含哪些字符),和其他字符集編碼之間的關(guān)系等。 ASCII ASCII碼是7位編碼,編碼范圍是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯?dāng)?shù)字和標(biāo)點(diǎn)符號(hào)等字符。其中0x00-0x20和0x7F共33個(gè)控制字符。 只支持ASCII碼的系統(tǒng)會(huì)忽略每個(gè)字節(jié)的Z高位,只認(rèn)為低7位是有效位。HZ字符編碼就是早期為了在只支持7位ASCII系統(tǒng)中傳輸中文而設(shè)計(jì)的編碼。早期很多郵件系統(tǒng)也只支持ASCII編碼,為了傳輸中文郵件必須使用BASE64或者其他編碼方式。 GB2312 GB2312是基于區(qū)位碼設(shè)計(jì)的,區(qū)位碼把編碼表分為94個(gè)區(qū),每個(gè)區(qū)對(duì)應(yīng)94個(gè)位,每個(gè)字符的區(qū)號(hào)和位號(hào)組合起來就是該漢字的區(qū)位碼。區(qū)位碼一般 用10進(jìn)制數(shù)來表示,如1601就表示16區(qū)1位,對(duì)應(yīng)的字符是“啊”。在區(qū)位碼的區(qū)號(hào)和位號(hào)上分別加上0xA0就得到了GB2312編碼。 區(qū)位碼中01-09區(qū)是符號(hào)、數(shù)字區(qū),16-87區(qū)是漢字區(qū),10-15和88-94是未定義的空白區(qū)。它將收錄的漢字分成兩級(jí):diyi級(jí)是常用漢字 計(jì)3755個(gè),置于16-55區(qū),按漢語拼音字母/筆形順序排列;第二級(jí)漢字是次常用漢字計(jì)3008個(gè),置于56-87區(qū),按部首/筆畫順序排列。一級(jí)漢 字是按照拼音排序的,這個(gè)就可以得到某個(gè)拼音在一級(jí)漢字區(qū)位中的范圍,很多根據(jù)漢字可以得到拼音的程序就是根據(jù)這個(gè)原理編寫的。 GB2312字符集中除常用簡(jiǎn)體漢字字符外還包括希臘字母、日文平假名及片假名字母、俄語西里爾字母等字符,未收錄繁體中文漢字和一些生僻字??梢杂梅斌w漢字測(cè)試某些系統(tǒng)是不是只支持GB2312編碼。 GB2312的編碼范圍是0xA1A1-0x7E7E,去掉未定義的區(qū)域之后可以理解為實(shí)際編碼范圍是0xA1A1-0xF7FE。 EUC-CN可以理解為GB2312的別名,和GB2312完全相同。 區(qū)位碼更應(yīng)該認(rèn)為是字符集的定義,定義了所收錄的字符和字符位置,而GB2312及EUC-CN是實(shí)際計(jì)算機(jī)環(huán)境中支持這 種字符集的編碼。HZ和ISO-2022-CN是對(duì)應(yīng)區(qū)位碼字符集的另外兩種編碼,都是用7位編碼空間來支持漢字。區(qū)位碼和GB2312編碼的關(guān)系有點(diǎn)像 Unicode和UTF-8。 GBK GBK編碼是GB2312編碼的超集,向下完全兼容GB2312,同時(shí)GBK收錄了Unicode基本多文種平面中的所有CJK漢字。同 GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的 漢字部首符號(hào)、豎排標(biāo)點(diǎn)符號(hào)等字符。 GBK的整體編碼范圍是為0x8140-0xFEFE,不包括低字節(jié)是0×7F的組合。高字節(jié)范圍是0×81-0xFE,低字節(jié)范圍是0x40-7E和0x80-0xFE。 低字節(jié)是0x40-0x7E的GBK字符有一定特殊性,因?yàn)檫@些字符占用了ASCII碼的位置,這樣會(huì)給一些系統(tǒng)帶來麻煩。 有些系統(tǒng)中用0x40-0x7E中的字符(如“|”)做特殊符號(hào),在定位這些符號(hào)時(shí)又沒有判斷這些符號(hào)是不是屬于某個(gè) GBK字符的低字節(jié),這樣就會(huì)造成錯(cuò)誤判斷。在支持GB2312的環(huán)境下就不存在這個(gè)問題。需要注意的是支持GBK的環(huán)境中小于0x80的某個(gè)字節(jié)未必就 是ASCII符號(hào);另外就是Z好選用小于0×40的ASCII符號(hào)做一些特殊符號(hào),這樣就可以快速定位,且不用擔(dān)心是某個(gè)漢字的另一半。Big5編碼中也存在相應(yīng)問題。 CP936和GBK的有些許差別,絕大多數(shù)情況下可以把CP936當(dāng)作GBK的別名。 GB18030 GB18030編碼向下兼容GBK和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括ZG少數(shù)民族字符,GBK不支持的韓文字符等等,也可以說是世界大多民族的文字符號(hào)都被收錄在內(nèi)。 GBK和GB2312都是雙字節(jié)等寬編碼,如果算上和ASCII兼容所支持的單字節(jié),也可以理解為是單字節(jié)和雙字節(jié)混合的變長(zhǎng)編碼。GB18030編碼是變長(zhǎng)編碼,有單字節(jié)、雙字節(jié)和四字節(jié)三種方式。 GB18030的單字節(jié)編碼范圍是0x00-0x7F,完全等同與ASCII;雙字節(jié)編碼的范圍和GBK相同,高字節(jié)是0x81-0xFE,低字節(jié) 的編碼范圍是0x40-0x7E和0x80-FE;四字節(jié)編碼中diyi、三字節(jié)的編碼范圍是0x81-0xFE,二、四字節(jié)是0x30-0x39。 Windows中CP936代碼頁使用0x80來表示歐元符號(hào),而在GB18030編碼中沒有使用0x80編碼位,用其他位置來表示歐元符號(hào)。這可以理解為是GB18030向下兼容性上的一點(diǎn)小問題;也可以理解為0x80是CP936對(duì)GBK的擴(kuò)展,而GB18030只是和GBK兼容良好。 BIG5 Big5是雙字節(jié)編碼,高字節(jié)編碼范圍是0x81-0xFE,低字節(jié)編碼范圍是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字節(jié)是0x80-0xA0的組合。0x8140-0xA0FE是保留區(qū)域,用于用戶造字區(qū)。 Big5收錄的漢字只包括繁體漢字,不包括簡(jiǎn)體漢字,一些生僻的漢字也沒有收錄。GBK收錄的日文假名字符、俄文字符Big5也沒有收錄。因?yàn)锽ig5當(dāng)中收錄的字符有限,因此有很多在Big5基礎(chǔ)上擴(kuò)展的編碼,如倚天中文系統(tǒng)。Windows系統(tǒng)上使用的代碼頁CP950也可以理解為是對(duì)Big5的擴(kuò)展,在Big5的基礎(chǔ)上增加了7個(gè)漢字和一些符號(hào)。Big5編碼對(duì)應(yīng)的字符集是GBK字符集的子集,也就是說Big5收錄的字符是GBK收錄字符的一部分,但相同字符的編碼不同。 因?yàn)锽ig5也占用了ASCII的編碼空間(低字節(jié)所使用的0x40-0x7E),所以Big5編碼在一些環(huán)境下存在和GBK編碼相同的問題,即低字節(jié)范圍為0x40-0x7E的字符有可能會(huì)被誤處理,尤其是低字節(jié)是0x5C("/")和0x7C("|")的字符??梢詤⒖糋BK一節(jié)相應(yīng)說明。 盡管有些區(qū)別,大多數(shù)情況下可以把CP950當(dāng)作Big5的別名。 ISO-8859-1 ISO-8859-1編碼是單字節(jié)編碼,向下兼容ASCII,其編碼范圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號(hào)。 ISO-8859-1收錄的字符除ASCII收錄的字符外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對(duì)應(yīng)的文字符號(hào)。歐元符號(hào)出現(xiàn)的比較晚,沒有被收錄在ISO-8859-1當(dāng)中。 因?yàn)镮SO-8859-1編碼范圍使用了單字節(jié)內(nèi)的所有空間,在支持ISO-8859-1的系統(tǒng)中傳輸和存儲(chǔ)其他任何編碼的字節(jié)流都不會(huì)被拋棄。換言之,把其他任何編碼的字節(jié)流當(dāng)作ISO-8859-1編碼看待都沒有問題。這是個(gè)很重要的特性,MySQL數(shù)據(jù)庫默認(rèn)編碼是Latin1就是利用了這個(gè)特性。ASCII編碼是一個(gè)7位的容器,ISO-8859-1編碼是一個(gè)8位的容器。 Latin1是ISO-8859-1的別名,有些環(huán)境下寫作Latin-1。 UCS-2和UTF-16 Unicode組織和ISO組織都試圖定義一個(gè)超大字符集,目的是要涵蓋所有語言使用的字符以及其他學(xué)科使用的一些特殊符號(hào),這個(gè)字符集就是通用字符集(UCS,Universal Character Set)。這兩個(gè)組織經(jīng)過協(xié)調(diào),雖然在各自發(fā)展,但定義的字符位置是完全一致的。ISO相應(yīng)的標(biāo)準(zhǔn)是ISO 10646。Unicode和ISO 10646都在不斷的發(fā)展過程中,所以會(huì)有不同的版本號(hào)來標(biāo)明不同的發(fā)展階段,每個(gè)Unicode版本號(hào)都能找到相對(duì)應(yīng)的ISO 10646版本號(hào)。 ISO 10646標(biāo)準(zhǔn)定義了一個(gè)31位的字符集。前兩個(gè)字節(jié)的位置(0x0000-0xFFFD)被稱為基本多語言面(Basic Multilingual Plane, BMP) ,超出兩個(gè)字節(jié)的范圍稱作輔助語言面。BMP基本包括了所有語言中絕大多數(shù)字符,所以只要支持BMP就可以支持絕大多數(shù)場(chǎng)合下的應(yīng)用。Unicode 3.0對(duì)應(yīng)的字符集在BMP范圍內(nèi)。 UCS字符集為每個(gè)字符分配了一個(gè)位置,通常用“U”再加上某個(gè)字符在UCS中位置的16進(jìn)制數(shù)作為這個(gè)字符的UCS表示,例如“U+0041”表示字符“A”。UCS字符U+0000到U+00FF與ISO-8859-1完全一致。 UCS-2、UTF-16是UCS字符集(或者說是Unicode字符集)實(shí)際應(yīng)用中的具體編碼方式。UCS-2是兩個(gè)字節(jié)的等寬編碼,因?yàn)橹皇鞘褂昧藘蓚€(gè)字節(jié)的編碼空間,所以只能對(duì)BMP中的字符做編碼。UTF-16是變長(zhǎng)編碼,用兩個(gè)字節(jié)對(duì)BMP內(nèi)的字符編碼,用4個(gè)字節(jié)對(duì)超出BMP范圍的輔助平面內(nèi)的字符作編碼。 UCS-2不同于GBK和Big5,它是真正的等寬編碼,每個(gè)字符都使用兩個(gè)字節(jié),這個(gè)特性在字符串截?cái)嗪妥址麛?shù)計(jì)算時(shí)非常方便。 UTF-16是UCS-2的超集,UTF-16編碼的兩字節(jié)編碼方式完全和UCS-2相同,也就是說在BMP的框架內(nèi)UCS-2完全等同與UTF-16。實(shí)際情況當(dāng)中常常把UCS-16當(dāng)作UCS-2的別名。 UCS-2和UTF-16在存儲(chǔ)和傳輸時(shí)會(huì)使用兩種不同的字節(jié)序,分別是big endian和little endian(大尾和小尾)。例如“啊”(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默認(rèn)的字節(jié)序是big endian方式。在傳輸過程中為了說明字節(jié)序需要在字節(jié)流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、UCS-2LE是實(shí)際應(yīng)用中使用的編碼名稱,對(duì)應(yīng)著big endian和little endian,UTF-16BE、UTF-16LE也是如此。因?yàn)槟J(rèn)是BE字節(jié)序,所以可以把UCS-2當(dāng)做是UCS-2BE的別名。 在UCS編碼中有一個(gè)叫做“ZERO WIDTH NO-BREAK SPACE”的字符,它的編碼是U+FEFF,是個(gè)沒有實(shí)際意義的字符。UCS規(guī)范建議我們?cè)趥鬏斪止?jié)流前,先傳輸字符“ZERO WIDTH NO-BREAK SPACE”,如果傳輸?shù)腪ERO WIDTH NO-BREAK SPACE是0xFEFF就說明是big endian,反之就是little endian。 UCS-2和UTF-16也可以理解為和ASCII以及ISO-8859-1兼容,在ASCII編碼或者ISO-8859-1編碼的每個(gè)字節(jié)前加上0x00,就得到相應(yīng)字符的UCS-2編碼。 UCS-2和UTF-16中會(huì)使用0x00作為某個(gè)字符編碼的一部分,某些系統(tǒng)會(huì)把0x00當(dāng)作字符串結(jié)束的標(biāo)志,在處理UCS-2或UTF-16編碼時(shí)會(huì)出現(xiàn)問題。 UTF-8 UTF-8是UCS字符集的另一種編碼方式,UTF-16的每個(gè)單元是兩個(gè)字節(jié)(16位),而UTF-8的每個(gè)單元是一個(gè)字節(jié)(8位)。UTF-16中用一個(gè)或兩個(gè)雙字節(jié)表示一個(gè)字符,UTF-8中用一個(gè)或幾個(gè)單字節(jié)表示一個(gè)字符。 可以認(rèn)為UTF-8編碼是根據(jù)一定規(guī)律從UCS-2轉(zhuǎn)換得到的,從UCS-2到UTF-8之間有以下轉(zhuǎn)換關(guān)系: UCS-2 UTF-8 U+0000 - U+007F 0xxxxxxx U+0080 - U+07FF 110xxxxx 10xxxxxx U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx 例如“啊”字的UCS-2編碼是0x554A,對(duì)應(yīng)的二進(jìn)制是0101 0101 0100 1010,轉(zhuǎn)成UTF-8編碼之后的二進(jìn)制是1110 0101 10 010101 10 001010,對(duì)應(yīng)的十六進(jìn)制是0xE5958A。 UCS-4也是一種UCS字符集的編碼方式,是使用4個(gè)字節(jié)的等寬編碼,可以用UCS-4來表示BMP之外的輔助面字符。UCS-2中每?jī)蓚€(gè)字節(jié)前再加上0x0000就得到了BMP字符的UCS-4編碼。從UCS-4到UTF-8也存在轉(zhuǎn)換關(guān)系,根據(jù)這種轉(zhuǎn)換關(guān)系,UTF-8Z多可以使用六個(gè)字節(jié)來編碼UCS-4。 根據(jù)UTF-8的生成規(guī)律和UCS字符集的特性,可以看到UTF-8具有的特性: UTF-8完全和ASCII兼容,也就是說ASCII對(duì)應(yīng)的字符在UTF-8中和ASCII編碼完全一致。范圍在0x00-0x7F之內(nèi)的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。 大于U+007F的UCS字符,在UTF-8編碼中至少是兩個(gè)字節(jié)。 UTF-8中的每個(gè)字符編碼的首字節(jié)總在0x00-0xFD之間(不考慮UCS-4支持的情況,首字節(jié)在0x00-0xEF之間)。根據(jù)首字節(jié)就可以判斷之后連續(xù)幾個(gè)字節(jié)。 非首字節(jié)的其他字節(jié)都在0x80-0xBF之間;0xFE和0xFF在UTF-8中沒有被用到。 GBK編碼中的漢字字符都在UCS-2中的范圍都在U+0800 - U+FFFF之間,所以每個(gè)GBK編碼中的漢字字符的UTF-8編碼都是3個(gè)字節(jié)。但GBK中包含的其他字符的UTF-8編碼就不一定是3個(gè)字節(jié)了,如GBK中的俄文字符。 在UTF-8的編碼的傳輸過程中即使丟掉一個(gè)字節(jié),根據(jù)編碼規(guī)律也很容易定位丟掉的位置,不會(huì)影響到其他字符。在其他雙字節(jié)編碼中,一旦損失一個(gè)字節(jié),就會(huì)影響到此字節(jié)之后的所有字符。從這點(diǎn)可以看出UTF-8編碼非常適合作為傳輸編碼
-
贊(14)
回復(fù)(0)
登錄或新用戶注冊(cè)
- 微信登錄
- 密碼登錄
- 短信登錄
請(qǐng)用手機(jī)微信掃描下方二維碼
快速登錄或注冊(cè)新賬號(hào)
微信掃碼,手機(jī)電腦聯(lián)動(dòng)
注冊(cè)登錄即表示同意《儀器網(wǎng)服務(wù)條款》和《隱私協(xié)議》
熱門問答
- 編碼方式是什么?
- 解釋一下: 1.BIG5 2.GB2312 這與USB連接有關(guān)系嗎?
2017-09-20 21:04:13
402
1
- 編碼方式
- ?úμ?óê?tò??-ê?μ?,?DD??ú??éúD¤′??μμ??§3?~&Egrav... ?úμ?óê?tò??-ê?μ?,?DD??ú??éúD¤′??μμ??§3?~è?1??úμ??¨òé?ò??BUG±?2éó??ò??±?è·è?oó?ò???á???ˉ?áê?oó?±?ó·¢·????ú~ 以上一段文字,不知道用的什么編碼方式,解不出來,全是亂碼... 試過UTF-8,GB2312,GB18030,全不行,誰能幫忙解一下?謝謝. 展開
2008-07-15 20:35:34
393
1
- 你好,這個(gè)編碼方式就是實(shí)數(shù)編碼么?
- “matlab中 a=1:19; 如何實(shí)現(xiàn)a中19個(gè)數(shù)的隨機(jī)交換,用遺傳算法如何實(shí)現(xiàn)diyi步的編碼 謝謝 ” 就是這個(gè)問題,您的回答還是用二進(jìn)制的來轉(zhuǎn)換的吧
2018-04-08 20:49:05
460
1
- 怎樣查看txt文件編碼方式
- 一根 .txt 文件,怎樣知道它是 ANSI UTF-8 還是 Unicode 編碼格式?
2009-05-08 07:24:39
405
3
- SH編碼是什么編碼
- SH編碼是什么編碼,應(yīng)該和HS編碼不是同一個(gè)編碼吧。。 其實(shí)這兩個(gè)編碼我都不知道是指什么,希望了解的人可以幫我解答,謝謝。
2008-08-24 10:17:17
954
3
- 編碼和譯碼是什么?編碼器和譯碼器物理實(shí)現(xiàn)方式
- 問題一、編碼是將模擬的電信號(hào)轉(zhuǎn)換成二進(jìn)制數(shù)字信號(hào)嗎?用一連串的二進(jìn)制數(shù)字代表某一對(duì)象這個(gè)是不是也叫編碼呢?還是編碼直接diyi將模擬電信號(hào)轉(zhuǎn)換成二進(jìn)制然后再對(duì)二進(jìn)制進(jìn)行編碼(一串二進(jìn)制數(shù)代表某一對(duì)象或指令)? 問題二、譯碼是將二進(jìn)制數(shù)轉(zhuǎn)換成模擬電... 問題一、編碼是將模擬的電信號(hào)轉(zhuǎn)換成二進(jìn)制數(shù)字信號(hào)嗎?用一連串的二進(jìn)制數(shù)字代表某一對(duì)象這個(gè)是不是也叫編碼呢?還是編碼直接diyi將模擬電信號(hào)轉(zhuǎn)換成二進(jìn)制然后再對(duì)二進(jìn)制進(jìn)行編碼(一串二進(jìn)制數(shù)代表某一對(duì)象或指令)? 問題二、譯碼是將二進(jìn)制數(shù)轉(zhuǎn)換成模擬電信號(hào)嗎? 請(qǐng)各路大俠出手指教!謝謝!~ 展開
2011-01-22 18:37:10
510
2
- 怎么改變MyEclipse中的默認(rèn)編碼方式?
2018-03-02 08:39:50
379
1
- HS編碼是什么
- HS編碼是什么
2007-06-14 03:03:25
556
5
- 地方編碼是什么
- 地方編碼是什么
2017-06-30 13:26:45
538
1
- “%23=#”是什么編碼?
2018-12-11 01:06:19
300
0
- 供應(yīng)商編碼是什么
2017-09-30 19:23:39
411
2
- H.S編碼是什么
2012-11-18 02:58:23
359
4
- 物料編碼是什么?
2017-09-20 13:00:26
513
1
- 振動(dòng)傳感器編碼是什么?
振動(dòng)傳感器編碼是什么?
2020-10-26 11:33:27
293
0
- 我=%EF%BF%BD <--這是什么編碼方式?
- 漢字“我”= “%EF%BF%BD” 請(qǐng)問這是什么編碼方式?如何轉(zhuǎn)換? 我試過了,這個(gè)雖然很類似URL的編碼,但不是! “我”的URL的編碼是“%E6%88%91”
2006-03-15 06:00:56
724
2
- 臭氧發(fā)生器HS編碼是什么
2007-07-21 19:54:14
693
4
- 耳機(jī)海關(guān)編碼是什么
- 耳機(jī)海關(guān)編碼是什么
2011-04-28 19:18:24
897
2
- 郵箱編碼是什么意思?
2009-12-14 18:20:23
408
3
- 商家編碼是什么意思
2017-10-15 10:35:09
281
1
4月突出貢獻(xiàn)榜
推薦主頁
最新話題





參與評(píng)論
登錄后參與評(píng)論