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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

计算机编码发展历史和编码方式

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机编码发展历史和编码方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編碼是信息從一種形式或格式轉換為另一種形式的過程,也稱為計算機編程語言的代碼簡稱編碼。
用預先規定的方法將文字、數字或其它對象編成數碼,或將信息、數據轉換成規定的電脈沖信號。
編碼在電子計算機、電視、遙控和通訊等方面廣泛使用。
解碼,是編碼的逆過程。

為什么出現多種編碼?

相信計算機專業的都知道,所有的數據(文本,音頻,視頻等等)在計算機內部都是以二進制形式來表示的。而計算機內部為什么采用二進制則是由硬件決定的(計算機采用了具有兩種穩定狀態的二值電路)。這樣,就引出一個問題:
我們人類不適合直接看二進制。
因此,需要用一種方法,將二進制轉為我們能看懂的東西。編碼就應運而生了。

編碼發展歷史

第一階段:
在計算機中,所有的數據只可能是0或者1(用高電平和低電平分別表示1和0),那么我們通常看到的字符也就只能用0和1來表示。于是科學家們(這里指的是美國的科學家)就想出一個辦法,把一個特定的數字對應一個特定的字母進行存儲和傳輸,比如我需要存儲字母a,那么我存入一個數字97(即在計算機中存入二進制(01100001),這個過程叫做編碼(encode),而我們在讀取數據的時候,當遇到97時,我們就讓計算機顯示字母a,這個過程叫做解碼(decode)。
這里你應該知道:

  • 計算機看懂的東西我們看不懂,我們看懂的東西,計算機看不懂。

把計算機看懂的東西(二進制(01100001))變成我們看懂的東西(數字97,也就是a),這個過程叫解碼(decode)
把我們看懂的東西(數字97,也就是a)變成計算機看懂的東西(二進制(01100001)),這個過程叫做編碼(encode)
為了大家在數據傳輸的時候不至于產生誤會,那么我們需要讓所有的人都使用數字97來代表字母a,所以需要制定一份標準(即碼表),最開始的這個標準叫做ASCII碼表。
ASCII碼的實現方式:
最早的計算機在設計時采用8個比特(bit)作為一個字節(byte),所以,一個字節能表示的最大的整數就是255(二進制11111111=十進制255)。
由于計算機是美國人發明的,因此,最早只有127個字符被編碼到計算機里(即用一個字節的后七位),也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。

第二階段:
隨著發展,計算機開始普及,當計算機流傳到歐洲時,問題再次出現,原本的ASCII編碼只能解決美國人的編碼問題,無法將歐洲的文字表示出來。于是乎,歐洲人就把ASCII碼中沒用到的第一位給用了,即:

  • ASCII碼用一個字節的后七位,表示范圍是0-127;
  • 歐洲人把這個字節的第一位也用了,表示范圍0-255。除去原本的0-127,剩下128-255:128-159之間為控制字符,160-255位文字符號,其中包括了西歐語言、希臘語、泰語、阿拉伯語、希伯來語。磚家們決定把他們的編碼名稱叫做Latin1,后面由于歐洲統一制定ISO標準,所以又有了一個ISO的名稱,即ISO-8859-1。
  • 第三階段:
    計算機技術當然也傳到了亞洲大地,比如中國。原本的一個字節的8個位全都用完了,但是要處理中文顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。
    問題又來了:

    • 你可以想得到的是,全世界有上百種語言,日本把日文編到Shift_JIS里,韓國把韓文編到Euc-kr里,各國有各國的標準,就會不可避免地出現沖突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。

    因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。
    到了這里:已經知道的編碼方式主要有兩種:ASCIIUnicode
    現在,捋(lǚ)一捋ASCII編碼和Unicode編碼的區別:

  • ASCII編碼是1個字節,而Unicode編碼通常是2個字節。(如果要用到非常偏僻的字符,就需要4個字節)
  • 字母A用ASCII編碼是十進制的65,二進制的01000001;
  • 字符'0'用ASCII編碼是十進制的48,二進制的00110000,注意字符'0'和整數0是不同的;
  • 漢字中已經超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013,二進制的01001110 00101101。
  • 你可以猜測,如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是00000000 01000001。
    新的問題又出現了:

    • 如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。

    所以,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。
    UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間。

    字符ASCIIUnicodeUTF-8
    A0100000100000000 0100000101000001
    x01001110 0010110111100100 10111000 10101101

    從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作。

    ASCII,Unicode,utf-8之間的關系

    看完上面的東西,可能有點亂,我這里簡單總結一下ASCII,Unicode,utf-8之間的關系:

    • ASCII是計算機剛剛起步的時候用得編碼方式,特點是可以表示的字符特別少,但簡單易用。
    • Unicode是隨著計算機發展,ASCII已經無法表示世界各國這么多文字而出現的一個新的編碼方式,優點是編碼快速,缺點是占用內存大。(如果你的文本全都是英語,如果用Unicode時,每個字符占用兩個字節。而用ASCII每個字符只占用一個字節);
    • 為了解決Unicode的內存占用大問題,出現了utf-8,utf-8可以根據字符的類型,自動選擇最優編碼。但缺點是編碼速度慢。

    所以有了令人容易搞混的問題出現:

    • 什么時候用utf-8(這里utf-8已經包括ASCII,ASCII編碼實際上可以被看成是UTF-8編碼的一部分)編碼方式?什么時候用Unicode編碼方式?

    什么時候用utf-8編碼?
    答案很顯然:對內存消耗要求高的,對速度要求不高的場景下用utf-8。(注意:這里的速度是指cpu運算速度)
    那你就想啊,什么時候對內存消耗要求高?很容易地就想到當我們要保存在硬盤的時候肯定是想占用空間越少越好啊,當我們在網絡上傳輸肯定也想占用空間越少越好啊,所以,當我們的數據保存在硬盤的時候,當我們數據要在網絡傳輸的時候,用得就是utf-8編碼。

    什么時候用Unicode?
    答案顯然:對速度要求特別高的,相對之下占用空間大小可以稍微妥協的場景下用Unicode編碼。
    我們知道,數據想被處理,首先得加載都內存上,這樣,cpu才能以非常驚人的速度再內存上獲取要處理的數據。這樣,我們就輕易知道,當數據被加載到內存上時,在內存中的編碼方式是Unicode。
    我們來個總結:
    1.我們平時電腦磁盤中的一個文件(abc.txt)其實是以utf-8編碼方式存儲的,當我們打開這個文件時,這個文件在加載到內存的時候會轉變為Unicode編碼方式。

    2.瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器(所以你看到很多網頁的源碼上會有類似<meta charset="UTF-8" />的信息,表示該網頁正是用的UTF-8編碼。):

    參考:https://www.cnblogs.com/busui/p/9340339.html

    下篇文件主要介紹一下python3 中的編碼和解碼相關內容

    總結

    以上是生活随笔為你收集整理的计算机编码发展历史和编码方式的全部內容,希望文章能夠幫你解決所遇到的問題。

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