編碼,解碼與亂碼的原理與亂碼解決

2021-08-22 13:17:42 字數 1348 閱讀 7679

在做開發中肯定經常遇到亂碼這種事情,對於新手來說比較頭疼,很難解決。但其實只要等你了解的知識夠了之後,你就會發現太簡單了,而且高手是不會碰到亂碼的

首先用圖來表達這個內容,若看的懂圖,後面的長長的字就不用看了。

以iso-8859-1與utf-8為例:

*前言在說編譯碼之前,有必要提一下為什麼要編碼,解碼。我現在所寫的這些字,計算機都是不認識的,在它內部,只認識二進位制0,1,在它的儲存裡也沒有字元的說法,只有0,1。所謂的字元只是我們人類為了標識我們的世界裡的事物而創造的,現在有了計算機,它運算快,我們想讓它幫我們處理問題,但是他不認識字元,我們不認識0,1,於是,我們就規定(假設這樣規定):乙個位元組表示乙個字元,10000000 表示a,100000001 表示b 。。。。。。這種規定就叫編碼方式(0,1組合到具體字元的對映關係)。有了剛才的規定,現在,從計算機裡讀到10000000 ,則文字軟體就依照對映將其翻譯成a顯示呈現出來,反之亦然。

*正文正如前言所講,編碼實際上就是一種一對一的對映關係。但是不同人有不同的想法,有人說10000000 是a,有人說它是x(你們隨意),於是就產生很多種所謂的編碼方式(gbk,utf-8.。。。。)。不同的編碼方式將同一二進位制資料解釋成不同的字元,正是由於大家所用的標準不同,造成相互轉化時,誰也不認識誰(有一張票子,你說那是錢,一老外說是money,誰對誰錯呢?有點哲學的意思,應該看具體使用場景吧),於是亂碼了。所以應該保證你用什麼編碼儲存的,就用什麼編碼解釋它(解碼)。

*坑上面說了,開啟乙個檔案亂碼,一定是沒用它編碼的編碼方式來解釋,那我換成它的編碼方式來開啟就不亂了?

理論上講是這樣的。還是那上面舉例的編碼方式,第一種編碼認為100000000 應該表示a,反之a應解釋成10000000,第二種編碼認為應該表示@符號。那麼很明顯,我想儲存a,採用第一種方式 在磁碟上寫下10000000,當你用第二種編碼來解釋時,得到@符號,此時無意義,可以認為是亂碼,這時只需換回第一種編碼,就能正確取得a字元。

往往都是理論上,在實際中,特別是漢字編碼,很多字元編碼的範圍沒漢字範圍大,那他們怎麼辦呢?不認識的統統拿某一字元替換!比如上面的例子,假設第二種編碼只用到了10000011-101111111這個範圍來表示字元(它只認這麼多)如果它讀取到這個範圍以外的二進位制序列,它的對映關係裡沒有啊,那怎麼辦,就用自己有的某個字元替換咯,假設拿?(100011111)來表示所有不認識的序列。如你所見,亂碼了。此時,只是變現層是?字元,在磁碟上還是儲存的原本的二進位制序列,儘管此編碼不認識它,但總有乙個合適的編碼能正確解釋它。但是當你使用這個編碼按下儲存鍵時,剛才被替換的成?的字元是不是在此時也被當成你自己輸入的字元了?電腦可不管你這個字元哪兒來的,你按儲存就是儲存當前內容,於是?被儲存了(100011111),那麼也就相當於原來的字元已經在二進位制資料上被?替換了。這時,你再換回原本的編碼也得不到原本的「正確」字元了。

MySQL PHP亂碼原理與解決

mysql php產生亂碼原因 mysql資料庫預設的編碼是utf8,如果這種編碼與你的php網頁不一致,可能就會造成mysql亂碼 mysql中建立表時會讓你選擇一種編碼,如果這種編碼與你的網頁編碼不一致,也可能造成mysql亂碼 mysql建立表時新增欄位是可以選擇編碼的,如果這種編碼與你的網頁...

Python編碼宣告與亂碼

引言 剛接觸python的時候,第一印象就是開頭的編碼宣告,如下 coding utf 8 然後,當我的程式出現亂碼的情況下怎麼辦?改編碼型別,試一下gbk,試一下utf 8,但也不知道問題出在哪,有些不明覺厲。後面上網找了一下相關的資料,才有點明白這個編碼宣告到底起了什麼作用,主要參考了下面兩個 ...

指令的編碼與解碼原理

指令集是處理器體系架構的重要組成部分。指令集有兩個發展方面,包含以x86為代表的cisc 複雜指令集 和以arm mips為代表的risc 精簡指令集 cisc的目標是盡可能將經常使用的功能用最少甚至一條指令來實現,因此該指令相應的執行電路往往是複雜的,其側重的是硬體功能的實現 risc則相反,其是...