0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計算機(jī)編碼全解析(上)

jf_78858299 ? 來源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 10:28 ? 次閱讀

前言

你是不是工作了很多年了,一直沒搞清楚計算機(jī)中的各種編碼規(guī)則,雖然平時都會使用,但是內(nèi)部機(jī)制原理一直都是之其然而不知其所以然,開發(fā)中也會經(jīng)常涉及到這塊內(nèi)容,但都沒有太多重視,這可能會讓有吃一些虧(出項目bug了),本著追本溯源的精神或是為了讓自己在少出血bug,小余今天就來聊聊這塊內(nèi)容。

目錄

1.字符集與字符編碼

首先要明確兩概念, 字符集 (charset)和 字符編碼 (encoding)。

字符集

字符集顧名思義: 很多字符的集合 。這些字符組成一套字符系統(tǒng),用來表達(dá)我們生活中各種含義,

比如0~9以及各種加減法等符號的集合,可以表示生活中的“數(shù)字集合”,不然1+1是什么計算機(jī)可不知道? 26個大小寫英文字母加上標(biāo)點(diǎn)符號就組成了“英文字符集“,這些字符集在英美人看來就組成了一套符號系統(tǒng),看到”I Love you“就知道什么意思了。 再比如我們新華字典中的所有漢字加上標(biāo)點(diǎn)符號就組成了“中文字符集”,這個字符集就組成了中文文字系統(tǒng)??吹健拔覑勰恪币簿椭朗裁匆馑剂?,可以對于不懂中文的老外來,因?yàn)闆]有中文字符集,看到“我愛你”可就一臉懵逼了。

字符編碼

字符編碼 :言外之意就是 對字符進(jìn)行編碼 ,那為什么要對字符編碼,其實(shí)字符編碼最終目的就是為了存儲或者傳輸。我們的計算機(jī)最早是用來提供算術(shù)功能的,和算盤功能類似,但是后來發(fā)現(xiàn)計算機(jī)可以做很多事情。 其中就包括存儲機(jī)制,如何存儲呢?假設(shè)“LOVE”這個單詞,我們使用數(shù)字1代表L,數(shù)字2代表O,數(shù)字3代表V,數(shù)字4代表E,將1234存儲在某個區(qū)域,這樣就可以知道這4個數(shù)字代表了“LOVE”,當(dāng)然實(shí)際LOVE有自己的字符表示,這里使用1234作為例講解。

字符編碼的四個步驟

要在計算機(jī)中建立一個“字符編碼模型”,需要四個步驟:

  • 1.要有一個 字符庫 ,確定這些字符庫足夠表意。比如ASCII字符集,已經(jīng)足夠表示英文系統(tǒng),但是不能表達(dá)中文,于是有了GB2312字符集。
    1. 第一層編碼 :給每個字符選個數(shù)字(Code Point),比如ASCII碼中,用65表示“A”,97表示“a”。
    1. 第二層編碼 :確定表示字符的二進(jìn)制位數(shù)(8位,16位,32位)。ASCII碼使用7位來表示,因?yàn)楫?dāng)時制定者覺得7位以及夠用了,DBCS(雙字節(jié)字符集)使用了16位。
  • 4.第三層編碼: 確定字符的二進(jìn)制存儲方式(大端還是小端)。比如X86機(jī)器使用小端。

一個字符一般只有一種編碼格式,當(dāng)字符集中的字符不夠用時,會增加一些新的字符,使用新的字符編碼格式,形成新的字符集。所以 有時候字符集和字符編碼的概念是很模糊的,并不嚴(yán)格區(qū)分 。比如ASCII碼既可以成為一段“字符集”,也可以稱為一種“編碼格式”。

也有一些字符集有多種編碼格式:如Unicode,其中UTF-8和UTF-16等都是其編碼格式,這個后面是詳細(xì)講解。

2.常用計算機(jī)編碼

1.ASCII碼

ASCII碼全稱“American Standard Code for Information Interchange”, 美國標(biāo)準(zhǔn)信息交互碼 ,由美國標(biāo)準(zhǔn)委員會(American Standards Association,簡稱ASA)制定,后來該協(xié)會改組為“美國國家標(biāo)準(zhǔn)學(xué)會”(American National Standard Institute , 簡稱ANSI ),所以很多資料上說ASCII碼是由ANSI指定的。

ASCII碼是從電報碼發(fā)展過來的,最早使用在7-bits電傳打印機(jī)上。1960年,ASA將ASCII標(biāo)準(zhǔn)化,于1963年發(fā)布第一版,1967年再發(fā)布一次大的版本,這個標(biāo)準(zhǔn)版本,也是一個7-bit碼,包含33個非打印字符(現(xiàn)在許多已經(jīng)廢棄了),95個打印字符(包含空格符),編碼范圍為0~127。

圖片

然而ASCII碼只是美國的標(biāo)準(zhǔn),對于其他國家,如中文,日文,韓文等大多使用的是象形文字,127個字符遠(yuǎn)遠(yuǎn)無法表達(dá)中國的漢字文化,于是各國在ASCII的基礎(chǔ)上制定了自己的字符集,但是 本質(zhì)上都兼容ASCII ,如中國大陸的GK2312,臺灣省的(Big5)小日子的JIS等編碼規(guī)范。

2.EASCII

其實(shí)標(biāo)準(zhǔn)的ASCII就是7-bit的編碼(8字節(jié),但是最高位沒有編碼),后來使用過程中發(fā)現(xiàn)127個字符有點(diǎn)不夠用,于是將ASCII進(jìn)行了擴(kuò)展,叫做EASCII或者h(yuǎn)igh-ASCII,8位的,能表示256個字符。

由于不同的應(yīng)用場景,有不同的編碼,有IBM的Extend ASCII和ANSI的Extend ASCII。 去wikipedia上會發(fā)現(xiàn)有好多種ASCII的標(biāo)準(zhǔn),大類就是IBM和ANSI(Windows的,微軟很強(qiáng)勢,ANSI的東西感覺就是給他們家用的)兩種,其實(shí)都是為了給自家系統(tǒng)用的,隨著IBM操作系統(tǒng)的墜落,IBM的擴(kuò)展ASCII也根本上淡出視野。

擴(kuò)展的ASCII的產(chǎn)生

搭載Windows系統(tǒng)的計算機(jī)進(jìn)入歐洲之后,發(fā)現(xiàn)標(biāo)準(zhǔn)的ASCII并不能滿足歐洲這些拉丁語族國家的語言表意,決定對其進(jìn)行擴(kuò)展。同為印歐語系,發(fā)現(xiàn)擴(kuò)展起來也沒那么難,總共256個值就包括所有了。只需要將原來的7-bit擴(kuò)展為8-bit,將原來的標(biāo)準(zhǔn)ASCII保留,第一位使用0來表示。將擴(kuò)展的字符第一位使用1來表示

擴(kuò)展ASCII的組成

具體來講,擴(kuò)展后的ASCII碼表可以看成 由三部分組成

  • 第一部分 :由00H到1FH共32個,一般用來通訊或作為控制之用。有些可以顯示在屏幕上,有些則不能顯示,但能看到其效果(如換行、退格)
  • 第二部分 :是由20H到7FH共96個,這95個字符是用來表示阿拉伯?dāng)?shù)字、英文字母大小寫和下劃線、括號等符號,都可以顯示在屏幕上.
  • 第三部分 :由80H到0FFH共128個字符,一般稱為"擴(kuò)充字符",這128個擴(kuò)充字符是由IBM制定的,并非標(biāo)準(zhǔn)的ASCII碼.這些字符是用來表示框線、音標(biāo)和其它歐洲非英語系的字母。

圖片

3.ISO-8859

由于每個國家以及公司對編碼的各自定制化,導(dǎo)致 同一個字符在不同電腦之間由于編碼的不一致,顯示的結(jié)果也不一樣,現(xiàn)象就是亂碼 。 那為了解決這個問題,ISO組織統(tǒng)一了一套標(biāo)準(zhǔn)的字符集。

與ASCII、EASCII字符編碼方案只包括單個獨(dú)立的字符集不同,ISO/IEC 8859字符編碼方案包括了一組字符集, 或者說ISO/IEC 8859相當(dāng)于是一組字符集的總稱,其內(nèi)共包含了15個字符集, 即ISO/IEC 8859-n,n=1、2、3…15、16,其中12未定義,所以實(shí)際上共15個。

這15個字符集,大致上包括了歐洲各國所使用到的字符(甚至還包括一些外來語字符),而且每一個字符集的補(bǔ)充擴(kuò)展部分(即除了兼容ASCII字符之外的部分),都只實(shí)際使用了0xA00xFF(十進(jìn)制為160255)這96個編碼,而0x800x9F(十進(jìn)制為128159)這32個編碼并未實(shí)際定義字符。

其中,目前使用得最為普遍的是ISO/IEC 8859-1字符集,收錄了西歐常用字符(包括德法兩國的字母)。

ISO/IEC 8859-1往往簡稱為ISO 8859-1,而且還有一個稱之為Latin-1(也寫作Latin1)的別名,即:ISO/IEC 8859-1 = ISO 8859-1 = Latin-1 = Latin1。

圖片

從ISO 8859-1到ISO 8859-16各自所收錄的字符分別如下:

ISO/IEC 8859-1 (Latin-1) - 西歐語言
ISO/IEC 8859-2 (Latin-2) - 中歐語言
ISO/IEC 8859-3 (Latin-3) - 南歐語言。世界語也可用此字符集顯示。
ISO/IEC 8859-4 (Latin-4) - 北歐語言
ISO/IEC 8859-5 (Cyrillic) - 斯拉夫語言
ISO/IEC 8859-6 (Arabic) - 阿拉伯語
ISO/IEC 8859-7 (Greek) - 希臘語
ISO/IEC 8859-8 (Hebrew) - 希伯來語(視覺順序)
ISO 8859-8-I - 希伯來語(邏輯順序)
ISO/IEC 8859-9(Latin-5 或 Turkish)- 它把Latin-1的冰島語字母換走,加入土耳其語字母。
ISO/IEC 8859-10(Latin-6 或 Nordic)- 北日耳曼語支,用來代替Latin-4。
ISO/IEC 8859-11 (Thai) - 泰語,從泰國的 TIS620 標(biāo)準(zhǔn)字集演化而來。
ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波羅的語族
ISO/IEC 8859-14(Latin-8 或 Celtic)- 凱爾特語族
ISO/IEC 8859-15 (Latin-9) - 西歐語言,加入Latin-1欠缺的芬蘭語字母和大寫法語重音字母,以及歐元(€)符號。
ISO/IEC 8859-16 (Latin-10) - 東南歐語言。主要供羅馬尼亞語使用,并加入歐元符號。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7360

    瀏覽量

    87633
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    932

    瀏覽量

    54731
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    15639
收藏 人收藏

    評論

    相關(guān)推薦

    計算機(jī)與網(wǎng)絡(luò)技術(shù)基礎(chǔ)

    計算機(jī)與網(wǎng)絡(luò)技術(shù)基礎(chǔ)了解計算機(jī)網(wǎng)絡(luò)的形成與發(fā)展過程  掌握計算機(jī)網(wǎng)絡(luò)的定義、分類、功能和典型應(yīng)用  掌握計算機(jī)網(wǎng)絡(luò)的組成結(jié)構(gòu)  了解
    發(fā)表于 12-07 13:36

    計算機(jī)與第三方設(shè)備通信時,常用的計算機(jī)編碼

    計算機(jī)與第三方設(shè)備通信時,常用的計算機(jī)編碼
    發(fā)表于 07-10 13:06

    什么是計算機(jī)系統(tǒng)、計算機(jī)硬件和計算機(jī)軟件?

    第一章 計算機(jī)系統(tǒng)概論1. 什么是計算機(jī)系統(tǒng)、計算機(jī)硬件和計算機(jī)軟件?硬件和軟件哪個更重要?解:P3計算機(jī)系統(tǒng):由
    發(fā)表于 07-22 09:06

    計算機(jī)運(yùn)算速度是指什么

    計算機(jī)運(yùn)算速度是指什么?按傳輸介質(zhì)分類,計算機(jī)網(wǎng)絡(luò)可分為哪幾種?使用16位二進(jìn)制編碼表示聲音與使用8位二進(jìn)制編碼表示聲音的效果有何不同?
    發(fā)表于 10-19 09:05

    什么是程序?什么是計算機(jī)

    什么是程序?程序(Program)流程、議程、行程、…為了完成某項任務(wù),解決某個問題需要執(zhí)行的一系列步驟計算機(jī)程序?yàn)榱送瓿赡稠椚蝿?wù),解決某個問題由計算機(jī)執(zhí)行的一系列指令(步驟)什么是計算機(jī)?
    發(fā)表于 11-23 09:02

    計算機(jī)應(yīng)用基礎(chǔ)教案

    介紹什么是計算機(jī),計算機(jī)的特點(diǎn),計算機(jī)的應(yīng)用與發(fā)展:什么是計算機(jī);計算機(jī)的發(fā)展;計算機(jī)的分類;
    發(fā)表于 09-25 12:45 ?0次下載

    計算機(jī)應(yīng)用基礎(chǔ)課程

    計算機(jī)的分類、特點(diǎn)及應(yīng)用領(lǐng)域 計算機(jī)的進(jìn)位計數(shù)制 計算機(jī)的信息編碼標(biāo)準(zhǔn)
    發(fā)表于 05-15 09:57 ?0次下載

    用SD卡設(shè)計8086計算機(jī)的硬盤

    介紹了8086計算機(jī)的體系架構(gòu),設(shè)計了8086計算機(jī)與SD卡連接的硬件接口,并使用軟件和硬件相結(jié)合的調(diào)試方法,可快速調(diào)試驗(yàn)證SD卡的功能.通過FPGA的驗(yàn)證,SD卡作為8086
    發(fā)表于 11-09 16:47 ?66次下載

    計算機(jī)尋址方式解析

    計算機(jī)尋址方式解析 尋址方式 就是尋找操作數(shù)地址的方式,解決的是如何在指令中表示一個操作數(shù)的地址。 形式地址 :在指令中出現(xiàn)的操作數(shù)地址
    發(fā)表于 04-15 11:22 ?6777次閱讀

    2002()《計算機(jī)原理》試卷

    2002()《計算機(jī)原理》試卷
    發(fā)表于 04-15 13:52 ?559次閱讀

    從5個方面來解析計算機(jī)中的字符編碼概念

    字符編碼計算機(jī)編程中不可回避的問題,不管你用 Python2 還是 Python3,亦或是 C++, Java 等,我都覺得非常有必要厘清計算機(jī)中的字符編碼概念。
    的頭像 發(fā)表于 01-16 09:08 ?7873次閱讀
    從5個方面來<b class='flag-5'>解析</b><b class='flag-5'>計算機(jī)</b>中的字符<b class='flag-5'>編碼</b>概念

    計算機(jī)算術(shù)運(yùn)算實(shí)現(xiàn)原理

    計算機(jī)算術(shù)運(yùn)算實(shí)現(xiàn)原理解。
    發(fā)表于 03-26 14:04 ?5次下載

    比量子計算機(jī)更容易構(gòu)建的新的計算機(jī)制造方法 用液晶構(gòu)建計算機(jī)

    兩位科學(xué)家在最新一期《科學(xué)進(jìn)展》雜志撰文提出了一種新的計算機(jī)制造方法:用液晶構(gòu)建計算機(jī),這種計算機(jī)將使用分子的朝向來存儲數(shù)據(jù)。在液晶計算機(jī)
    的頭像 發(fā)表于 08-24 19:58 ?1268次閱讀

    計算機(jī)編碼解析(中)

    你是不是工作了很多年了,一直沒搞清楚計算機(jī)中的各種編碼規(guī)則,雖然平時都會使用,但是內(nèi)部機(jī)制原理一直都是之其然而不知其所以然,開發(fā)中也會經(jīng)常涉及到這塊內(nèi)容,但都沒有太多重視,這可能會讓有吃一些虧(出項目bug了),本著追本溯源的精神或是為了讓自己在少出血bug
    的頭像 發(fā)表于 03-30 10:28 ?1130次閱讀
    <b class='flag-5'>計算機(jī)</b><b class='flag-5'>編碼</b><b class='flag-5'>全</b><b class='flag-5'>解析</b>(中)

    計算機(jī)編碼解析(下)

    你是不是工作了很多年了,一直沒搞清楚計算機(jī)中的各種編碼規(guī)則,雖然平時都會使用,但是內(nèi)部機(jī)制原理一直都是之其然而不知其所以然,開發(fā)中也會經(jīng)常涉及到這塊內(nèi)容,但都沒有太多重視,這可能會讓有吃一些虧(出項目bug了),本著追本溯源的精神或是為了讓自己在少出血bug
    的頭像 發(fā)表于 03-30 10:29 ?954次閱讀
    <b class='flag-5'>計算機(jī)</b><b class='flag-5'>編碼</b><b class='flag-5'>全</b><b class='flag-5'>解析</b>(下)