日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)

發布時間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 常見字符集 (ASCII、GBK、UTF-8、編碼方案,解碼方案、亂碼等問題)
    • 1.ASCII編碼
    • 2.GBK編碼(漢子內碼擴展規范,國標)
    • 3.UTF-8編碼
      • Unicode字符集(統一碼,也加萬國碼)
      • UTF-8編碼方式
    • 4.java代碼實現字符的編、解碼
      • 編碼
      • 解碼

常見字符集 (ASCII、GBK、UTF-8、編碼方案,解碼方案、亂碼等問題)

1.ASCII編碼

  • 當美國人發明計算機時,他們遇到了一個問題:要想讓計算機來處理數據,首先得讓計算機
    能夠存儲美國人的文字,但是計算機是機器只能處理 0和1(二進制數) 兩種信號,為此美
    國人設計出了一套能夠讓計算機存儲他們文字的編碼(ASCII編碼)。由于美國人的文字只
    由數字(09)、26個字母(az,A~Z)、標點符號以及一些特殊字符組成,加起來總共127個字符,
    于是美國人就給這127個字符進行編號:從0到127(0~127)。為了讓計算機能夠存儲,他們就將
    每個編號轉換為對應二進制數,由于計算機存儲數據的基本單位是字節,而1字節用8位二進制數
    表示,而7位二進制數就可以表示0到127所有的字符,于是美國人就在每個字符編碼前面加了一
    位0,使其構成8位,至此美國人的文字在計算機中就用一位字節表示。

  • 標準ASCII字符集

    • ASCII(American Standard Code for Information Interchange):美國信息交換標準代碼,包括了英文符號等。

    • 標準ASCII使用1字節存儲一個字符,首位是0,總共可以表示128個字符,對美國佬來說完全夠用。

2.GBK編碼(漢子內碼擴展規范,國標)

  • 隨著計算機的使用越來越廣泛,當中國人看到美國人的編碼(ASCII編碼)時,說了一句:還不夠我塞牙縫!

  • 漢字編碼字符集,包含2萬多個漢字等字符,GBK中一個中文字符編碼成兩個字節的形式存儲。

  • 注意:GBK兼容了ASCII字符集。(這里提一句:因為計算機是美國人發明的,你要使用,就要聽話,
    遵守美國人制定的規則,所以需要兼容ASCII字符集)

  • 問題來了:如果英文數字用一個字節存儲,漢字用兩個字節存儲,那么當一段文字中既有漢字也有英文
    時,計算機是怎樣識別的呢?

    • GBK規定:漢字的第一個字節的第一位必須是1。當計算機讀取字節的時候發現該字節的第一位是1
      時,計算機就認為這是一個漢字,于是計算機就連讀取兩個字節來表示一個漢字,當計算機讀取字節
      時發現第一位是0,計算機就認為這是一個ASCII的字符,于是計算機就只讀取一個字節來表示為ASCII
      的字符。

3.UTF-8編碼

  • 當計算機在全世界普及時,如果每個國家都來一個編碼,比如:巴基斯坦碼、迪拜碼、島國碼、韓文碼、
    烏茲別克斯坦碼、吉爾吉斯斯坦碼、哈薩克斯坦碼這么的編碼時,會出現現一個很嚴重的問題:信息在各個國
    家流通的時候,比如:韓文碼用迪拜碼打開時肯定會出現一個亂碼的問題!這時,國際組織就站出來了,說:
    你們都別整自己字符集了,我來給全世界國家整一套通用的字符集,叫Unicode字符集(統一碼,也加萬國碼)

Unicode字符集(統一碼,也加萬國碼)

  • Unicode是國際組織制定的,可以容納世界上所有文字、符號的字符集。

  • Unicod字符集提供了很多編碼方案,例如:UTF-32

    • UTF-32編碼方案的思想是:簡單粗暴,我用四個字節來存儲一個字符,有容乃大。

    • 但是UTF-32并沒有被人們所接納,因為人們覺得這種編碼太 奢侈 了,美國人ASCII字符集本來一個字節
      就可以存儲但是用UTF-32就需要用四個字節,空出來3個字節用不到還多要3倍的存儲空間,非常的浪費,就
      是連中國人的漢字也沒占到便宜,有兩位字節用不到,還要多用1倍的存儲空間。而且這樣字符在通訊效率上
      還會大大降低。

    • 國際組織站出來看好像也是啊,于是國際組織又設計了一套改變字符蒼生的新的編碼方案:UTF-8

UTF-8編碼方式

  • 是Unicode字符集的一種編碼方案嗎,采取可邊長方案,共分四個長度區:1字節,2字節,3字節,4字節
  • 英文字符、數字等只占1個字節(兼容標準ASCI編碼),漢字字符占用3個字節
UTF-8編碼方案說明
0xxxxxxx (ASCII碼)1個字節:第一位為0
110xxxxx 10xxxxxx2個字節:第一個字節前3位為110,第二個字節前2位位10
1110xxxx 10xxxxxx 10xxxxxx3個字節:第一個字節前4位為1110,第2個字節和第3個字節前2位都位10
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx4個字節:第一個字節前5位為11110,后3個字節每個字節前2位都為10
  • 其余位才用來存儲具體的字符編碼,從右開始排列

  • 注意:

    • 技術人員在開發的時候都應該使用UTF-8編碼!
    • 字符編碼時使用的字符集,和解碼時使用的字符集必須一致,否則會出現亂碼
    • 英文,數字一般不會亂碼,因為很多字符集都兼容了ASCII編碼。

4.java代碼實現字符的編、解碼

編碼

String提供如下方法說明
byte[] getBytes()使用平臺的默認字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中
byte[] getBytes(charsetName)使用指定字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中
import java.util.Arrays; /*使用java程序對字符進行編解碼。 */ public class Test {public static void main(String[] args){System.out.println("Hello World!");//1.編碼String data = "a愛b";byte[] bytes = data.getBytes(); // 默認是按照平臺字符集(UTF-8)進行編碼。/*輸出結果:[97, -26, -120, -111, 98]解析:[97, -26, -120, -111, 98]a 我 b在 utf-8編碼 中英文占一個字節,中文占三個字節*/System.out.println(Arrays.toString(bytes));//按指定的字符集進行編碼。byte[] bytes1 = data.getBytes("GBK");/*輸出結果:[97, -50, -46, 98]解析:[97, -50, -46, 98]a 我 b在 GBK編碼 中英文占一個字節,中文占兩個字節*/System.out.println(Arrays.toString(bytes1));} }

解碼

String提供如下方法說明
String(byte[] bytes)使用平臺的默認字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中
String(byte[] bytes, String charsetName)使用指定字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中
import java.io.UnsupportedEncodingException; import java.util.Arrays;/*使用java程序對字符進行編解碼。 */ public class Test {public static void main(String[] args) throws Exception {//1.編碼String data = "a我b";byte[] bytes = data.getBytes(); // 默認是按照平臺字符集(UTF-8)進行編碼。System.out.println(Arrays.toString(bytes));//按指定的字符集進行編碼。byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));//2.解碼String s1 = new String(bytes); // 按照平臺默認編碼(UTF-8)解碼。System.out.println(s1); // 輸出結果:a我b//String s2 = new String(bytes1); //用平臺默認的字符集(UTF-8)解碼用GBK字符集編碼的字符串//System.out.println(s2); //輸出亂碼結果:a��bString s2 = new String(bytes1,"GBK"); // 用與編碼相同的字符集(GBK)來解碼System.out.println(s2); //輸出結果:a我b} }

總結

以上是生活随笔為你收集整理的字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。