編碼字符集與字符集編碼

編碼字符集

  • ASCII:最先出現(xiàn)的編碼字符集幔睬,包含了大小寫的從A到Z和符號,用8位表示芹扭,共258個字符麻顶,老美一開始只固定了前127個字符(稱為半角),而后面127個字符是在計算機在其他歐美國家開始使用時擴展的冯勉,是擴展字符集(全角)澈蚌。

  • GB2312和GBK:當(dāng)中國開始使用計算機表示漢字時,ASCII已經(jīng)沒有空間可以給漢字字符填充灼狰,所以中國索性把兩個連在一起的大于127的ASCII字符當(dāng)作一個漢字宛瞄,這個方案稱為GB2312;當(dāng)GB2312不足夠表示所有漢字時交胚,中國規(guī)定 兩個連在一起的第一個字符大于127的兩個ASCII字符當(dāng)作一個漢字份汗,稱為GBK方案。因此會出現(xiàn):一個漢字字符相當(dāng)于兩個英文字符的情況蝴簇。

  • Unicode:當(dāng)計算機在全世界廣泛傳播時杯活,出現(xiàn)了許多編碼字符集,各個編碼字符集之間無法相互識別熬词,當(dāng)同時出現(xiàn)在同一篇文檔中會出現(xiàn)亂碼旁钧。因此國際標(biāo)準(zhǔn)組織ISO出臺了一套16位的字符編碼方案以總括現(xiàn)有的各個編碼字符集吸重, 稱為Unicode。在互聯(lián)網(wǎng)出現(xiàn)之后歪今,ISO規(guī)定了每次傳輸16位的方案稱為UTF-16

字符集編碼

  • Unicode是無法用16位表示所有文字字符的嚎幸,隨著不斷有文字填充,必將使用更多位表示寄猩,這就將導(dǎo)致ASCII中的半角前面許多位都是0嫉晶,白白浪費了空間。因此出現(xiàn)了Unicode的字符集編碼方案

  • UTF-16:Unicode最開始的編碼方案田篇,籠統(tǒng)地用兩個字節(jié)表示一個字符替废,不能解決空間浪費的問題

  • UTF-8:網(wǎng)絡(luò)每次傳輸8位,可變長度的編碼方案泊柬,可由1~4個字節(jié)表示一個字符椎镣,增加標(biāo)識符以表示多少個字節(jié)表示一個字符,更加自由彬呻,解決了空間浪費問題衣陶。但也存在問題,有些文字由于增加了多個標(biāo)識符闸氮,導(dǎo)致需要多個字節(jié)表示剪况,如一個漢字字符需要三個字節(jié)表示。

Java中的編碼字符集

  • I.java.lang.Character類規(guī)定了java使用的編碼字符集蒲跨,從java.lang.Character類注釋的解讀译断,我們可以知道:
    Java使用了Unicode編碼字符集,具體來說Java中的字符數(shù)值范圍是從0X0000到0x10FFFF或悲,而0x0000到0xFFFF支持UTF-16編碼方案孙咪,稱為BMP(Basic Multilingual Plane 基礎(chǔ)多語言面);大于0XFFFF的字符即是擴展字符巡语,大小相當(dāng)于兩個char類型字符翎蹈。
    char類型只支持BMP(即UTF-16包含的字符),char類型數(shù)據(jù)的value是一個Character類型數(shù)據(jù)男公,如’\u005CuD840’荤堪,它代表的是該char類型數(shù)據(jù)在Unicode database中指向的字符,即Character類型不等同于char類型枢赔, 如Character.isLetter(’\u005CuD840’)返回的是false澄阳,因為Character.isLetter(char char)要求的是傳入一個char類型的數(shù)據(jù),但該語句中傳入的是Character類型的數(shù)據(jù)
    int類型除了支持BMP外還支持?jǐn)U展字符踏拜,如 Character.isLetter(0x2F81A)返回的是true碎赢,0x2F81A是一個擴展字符的數(shù)值.

  • 注釋原文如下:

         * <p>A {@code char} value, therefore, represents Basic
         * Multilingual Plane (BMP) code points, including the surrogate
         * code points, or code units of the UTF-16 encoding. An
         * {@code int} value represents all Unicode code points,
         * including supplementary code points. The lower (least significant)
         * 21 bits of {@code int} are used to represent Unicode code
         * points and the upper (most significant) 11 bits must be zero.
         * Unless otherwise specified, the behavior with respect to
         * supplementary characters and surrogate {@code char} values is
         * as follows:
         *
         * <ul>
         * <li>The methods that only accept a {@code char} value cannot support
         * supplementary characters. They treat {@code char} values from the
         * surrogate ranges as undefined characters. For example,
         * {@code Character.isLetter('\u005CuD840')} returns {@code false}, even though
         * this specific value if followed by any low-surrogate value in a string
         * would represent a letter.
         *
         * <li>The methods that accept an {@code int} value support all
         * Unicode characters, including supplementary characters. For
         * example, {@code Character.isLetter(0x2F81A)} returns
         * {@code true} because the code point value represents a letter
         * (a CJK ideograph).
         * </ul>
         *
         * <p>In the Java SE API documentation, <em>Unicode code point</em> is
         * used for character values in the range between U+0000 and U+10FFFF,
         * and <em>Unicode code unit</em> is used for 16-bit
         * {@code char} values that are code units of the <em>UTF-16</em>

  • II.Character類中提供了判斷字符是BMP還是擴展字符的方法
public static final char MIN_VALUE = '\u0000';

        public static final char MAX_VALUE = '\uFFFF';                  

        public static final int MIN_CODE_POINT = 0x000000;

        public static final int MAX_CODE_POINT = 0X10FFFF;

        public static boolean isBmpCodePoint(int codePoint) {
            return codePoint >>> 16 == 0;
            // Optimized form of:
            //     codePoint >= MIN_VALUE && codePoint <= MAX_VALUE
            // We consistently use logical shift (>>>) to facilitate
            // additional runtime optimizations.
        }

        public static boolean isValidCodePoint(int codePoint) {
            // Optimized form of:
            //     codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT
            int plane = codePoint >>> 16;
            return plane < ((MAX_CODE_POINT + 1) >>> 16);
        }

提供了將擴展字符從數(shù)值轉(zhuǎn)為字符類型的方法

//從此處我們可以發(fā)現(xiàn),一個擴展字符相當(dāng)兩個char類字符
        static void toSurrogates(int codePoint, char[] dst, int index) {
            // We write elements "backwards" to guarantee all-or-nothing
            dst[index+1] = lowSurrogate(codePoint);
            dst[index] = highSurrogate(codePoint);
        }

學(xué)習(xí)內(nèi)容來自周華健的網(wǎng)課《[9節(jié)課征服「字符編碼」]》https://edu.51cto.com/sd/1c7de

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末速梗,一起剝皮案震驚了整個濱河市肮塞,隨后出現(xiàn)的幾起案子襟齿,更是在濱河造成了極大的恐慌,老刑警劉巖峦嗤,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕊唐,死亡現(xiàn)場離奇詭異屋摔,居然都是意外死亡烁设,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門钓试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來装黑,“玉大人,你說我怎么就攤上這事弓熏×堤罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵挽鞠,是天一觀的道長疚颊。 經(jīng)常有香客問我,道長信认,這世上最難降的妖魔是什么材义? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嫁赏,結(jié)果婚禮上其掂,老公的妹妹穿的比我還像新娘。我一直安慰自己潦蝇,他們只是感情好款熬,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攘乒,像睡著了一般贤牛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上则酝,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天殉簸,我揣著相機與錄音,去河邊找鬼堤魁。 笑死喂链,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妥泉。 我是一名探鬼主播椭微,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盲链!你這毒婦竟也來了蝇率?” 一聲冷哼從身側(cè)響起迟杂,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎本慕,沒想到半個月后排拷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡锅尘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年监氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤违。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪腐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顿乒,到底是詐尸還是另有隱情议街,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布璧榄,位于F島的核電站特漩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骨杂。R本人自食惡果不足惜涂身,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腊脱。 院中可真熱鬧访得,春花似錦、人聲如沸陕凹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杜耙。三九已至搜骡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑女,已是汗流浹背记靡。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留团驱,地道東北人摸吠。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像嚎花,于是被迫代替她去往敵國和親寸痢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容