目錄
先說一下什麼叫亂碼
接著說亂碼產生的原因
可以得出結論:
首頁 常見問題 中文亂碼的產生原因是什麼

中文亂碼的產生原因是什麼

Nov 09, 2022 am 11:14 AM
亂碼 中文亂碼

中文亂碼的產生原因:解碼方式和編碼方式不一致。一個中文字元以utf-8編碼會轉成3個byte,如果以gbk編碼會轉成2個byte;而一個英文字符以utf-8編碼會轉成1個byte,如果以gbk編碼會轉成1個byte。

中文亂碼的產生原因是什麼

本教學操作環境:windows7系統、Dell G3電腦。

先說一下什麼叫亂碼

不知道有沒有人這樣認為過,一個字串不只包含字符,還有隱藏著它的編碼訊息。例如java中String str = "你好";我之前是這樣認為的,str這個字串隱藏著它的編碼方式unicode編碼或gbk、iso-8859-1等。這種理解是錯誤的,字元就是字元沒有任何其他訊息,正確的理解應該是,人在一個檔案中所看到的字串是系統經過把記憶體中的數位資訊讀取也再解碼成一些字元最後顯示,就是當你雙擊打開一個文字檔案時系統會把記憶體的數位訊息讀取顯示出來,當你儲存一個文字檔案時系統會把這個檔案以你所設定的編碼方式編碼,再放進記憶體中。

所以說亂碼也是一些字符,只是奇怪的字符而已,並沒有什麼」碼「。

接著說亂碼產生的原因

我們經常看到網路上這樣解釋亂碼原因:亂碼是因為解碼方式和編碼方式不一致導致的,這句話本身沒有錯,但同樣這句話的本身就是把亂碼概括了而已,它並不能幫助你理解亂碼。

所以我們要提的問題是:為什麼解碼方式和編碼方式不一致會出現亂碼。

這裡以utf-8,gbk,iso-8859-1三種編碼方式為例。

     @Test
     public void testEncode() throws Exception {
        String str = "你好",en = "h?h";
        
        System.out.println("========中文字符utf-8=======");
        byte[] utf8 = str.getBytes(); // 以utf-8方式编码 ,default:utf-8
        for (byte b : utf8) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========英文字符utf-8=======");
        byte[] utf8_en = en.getBytes(); // 以utf-8方式编码 ,default:utf-8
        for (byte b : utf8_en) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========中文字符gbk=========");
        byte[] gbk = str.getBytes("gbk");
        for (byte b : gbk) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========英文字符gbk=========");
        byte[] gbk_en = en.getBytes("gbk");
        for (byte b : gbk_en) {            
            System.out.print(b + "\t");
        }
        
        String s = new String(utf8,"utf-8");
        String s1 = new String(utf8,"gbk");
        System.out.println("\n"+s + "====gbk:" + s1);
     }
登入後複製

測試上面方法,列印的結果是:

========中文字符utf-8=======
-28 -67  -96 -27  -91 -67  
========英文字符utf-8=======
104 63  104 
========中文字符gbk=========
-60 -29  -70 -61  
========英文字符gbk=========
104 63  104 
你好====gbk:浣犲ソ
------------------------------------------------------------------------------------
登入後複製

可以得出結論:

一個中文字元以utf-8編碼會轉成3個byte,如果以gbk編碼會轉成2個byte;

#一個英文字元以utf-8編碼會轉成1個byte,如果以gbk編碼會轉成1個byte。

從列印的最後一行結合29-31行程式碼可以看出,如果把byte數組utf8 以utf-8的方式解碼不會有亂碼,還是原來的」你好“,而如果以gbk方式解碼則出現了三個亂碼字符,為什麼是3個而不是2個呢,6/2=3。

接下來說iso-8859-1,這種編碼應用於英文系列,也就是說不能表示中文(如果要使用必須依賴於其它兼容iso-8859-1編碼方式的編碼),它讀不懂的字符都將被視為英文問號'?',英文問號的iso-8859-1編碼號是:63(十進制)(其實在幾乎所有的編碼方式中,所有英文字符都用1個固定的字節碼表示,unicode編碼除外)。

     @Test
     public void testISO() throws Exception {
         String str = "你好";
         byte[] bs = str.getBytes("iso-8859-1");
         for (byte b : bs) {
            System.out.println(b);
         }
         System.out.println(new String(bs,"iso-8859-1"));
         System.out.println(new String(bs,"utf-8"));
         System.out.println(new String(bs,"gbk"));
         System.out.println(new String(bs,"unicode"));         
     }
登入後複製

列印結果 

63
63
??
??
??
㼿
登入後複製

說明63 =》?,所有中文都被認為是?,所以說當執行這句代碼時:byte[] bs = "你好".getBytes ("iso-8859-1");訊息已遺失。

再執行String str = new String(bs,"任何charset");str已經不等於"你好"了,而是兩個問號??。所以在tomcat中我們會常常遇上中文變成一長串??????,就是源自於此。

在iso-8859-1、utf-8、gbk中一個字節碼表示一個英文字符,

在unicode編碼中一個字節碼並不能表示任何字符,而且規定必須是兩個字節碼(有時4個)才能表示一個字元。

說了這麼多,也許很多人會問為什麼要用這麼多編碼方式,統一成utf-8不就能表示所有字元了?

編碼不僅是要考慮是否能表示任何字符,還要考慮傳輸和儲存。

1、utf-8確實幾乎能表示所有已知字元。前面說過在utf-8編碼中3個字節才表示一個中文字符,這樣顯然佔空間,不利於傳輸和存儲(傳輸和存儲都是以二進制的方式進行的)

2、無疑一個位元組表示一個字元最省空間,例如iso-8859-1。但這世上不是只有英文字符,還有各地區國家的文字。所以字元的數量一定是大於2的8次方的。

所以結合以上兩點,就自然地出現了很多種編碼方式。

了解各種編碼方式的規則:https://jingyan.baidu.com/article/020278118741e91bcd9ce566.html

更多程式相關知識,請造訪:程式設計教學! !

以上是中文亂碼的產生原因是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Linux中文亂碼怎麼解決 Linux中文亂碼怎麼解決 Feb 21, 2024 am 10:48 AM

Linux中文亂碼問題是使用中文字元集和編碼時常見的一個問題。出現亂碼的原因可能是檔案編碼設定不正確,系統語言環境未安裝或未設置,以及終端顯示設定錯誤等。本文將介紹幾種常見的解決方法,並提供具體的程式碼範例。一、檢查檔案編碼設定使用file指令查看檔案編碼在終端機中使用file指令,可以檢視檔案的編碼:file-ifilename如果輸出中有"charset

tomcat啟動亂碼如何解決 tomcat啟動亂碼如何解決 Dec 26, 2023 pm 05:21 PM

tomcat啟動亂碼的解決方法:1、修改Tomcat的conf設定檔;2、修改系統語言;3、修改命令列視窗編碼;4、檢查Tomcat伺服器設定;5、檢查項目編碼;6、檢查日誌檔;7 、嘗試其他解決方案。詳細介紹:1、修改Tomcat的conf設定文件,開啟Tomcat的conf目錄,找到"logging.properties"檔案等等。

解決Windows10中文亂碼問題的方法 解決Windows10中文亂碼問題的方法 Jan 16, 2024 pm 02:21 PM

在Windows10系統中,出現亂碼現象可謂司空見慣。這背後的原因往往在於該作業系統並未對部分字元集提供預設的支持,抑或是設定的字元集選項有錯誤。為了對症下藥,以下我們將為您詳細解析實際的操作規程。 windows10亂碼怎麼解決1、開啟設置,找到「時間和語言」2、再找到「語言」3、找到「管理語言設定」4、點選這裡的「更改系統區域設定」5、如圖勾選上然後點擊確定就可以了。

解決PHP Dompdf中文亂碼問題的方法 解決PHP Dompdf中文亂碼問題的方法 Mar 05, 2024 pm 03:45 PM

解決PHPDompdf中文亂碼問題的方法PHPDompdf是一個用於將HTML文件轉換為PDF文件的工具,它的功能強大且易於使用。然而,在處理中文內容時,有時會遇到中文亂碼的問題。本文將介紹一些解決PHPDompdf中文亂碼問題的方法,並提供具體的程式碼範例。一、使用字體檔案在處理中文內容時,一個常見的問題是Dompdf預設不支援中

解決dll檔案開啟亂碼問題的編輯方式 解決dll檔案開啟亂碼問題的編輯方式 Jan 06, 2024 pm 07:53 PM

有很多的用戶在使用電腦的時候,會發現有很多的文件的尾綴是dll,但是很多的用戶們都不知道這種文件需要怎麼打開,想要知道的用戶們快來看看以下詳細教程吧~dll檔案怎麼打開編輯:1、下載一個​​叫做「exescope」的軟體,並下載安裝。 2、然後右鍵dll文件,選擇「用exescope編輯資源」。 3、然後在彈出的錯誤提示框中,點選「確定」。 4、然後在右邊的面板上,點擊每個組前面的「+」號可以查看到它所包含的內容。 5.點選需要檢視的dll文件,就能夠看到了,然後點選“文件”,選擇“匯出”。 6、然後就能夠

解決win11記事本中的亂碼問題 解決win11記事本中的亂碼問題 Jan 05, 2024 pm 03:11 PM

有些朋友想要打開一個記事本,發現自己的win11記事本亂碼,不知道怎麼辦,其實我們一般只需要修改區域和語言就可以了。 win11記事本亂碼:第一步,使用搜尋功能,搜尋並開啟「控制台」第二步,點擊時鐘和區域下的「更改日期、時間或數字格式」第三步,點擊上方的「管理」選項卡。第四步,點選下方「變更系統區域設定」第五步,將目前系統區域設定改為「中文(簡體,中國)」並「確定」儲存即可。

filezilla亂碼怎麼解決 filezilla亂碼怎麼解決 Nov 20, 2023 am 10:16 AM

filezilla亂碼的解決方法有:1、檢查編碼設定;2、檢查檔案本身;3、檢查伺服器設定;4、嘗試其他傳輸工具;5、更新軟體版本;6、檢查網路問題;7、尋求技術支援。解決FileZilla亂碼問題需要從多個方面入手,逐步排除問題原因,並採取相應的措施進行修復。

MySQL安裝中文亂碼的常見原因及解決方案 MySQL安裝中文亂碼的常見原因及解決方案 Mar 02, 2024 am 09:00 AM

MySQL安裝中文亂碼的常見原因及解決方案MySQL是一種常用的關係型資料庫管理系統,但在使用過程中可能會遇到中文亂碼的問題,這給開發者和系統管理員帶來了困擾。中文亂碼問題的出現​​主要是因為字元集設定不正確、資料庫伺服器和客戶端字元集不一致等原因導致的。本文將詳細介紹MySQL安裝中文亂碼的常見原因及解決方案,幫助大家更能解決這個問題。一、常見原因:字元集設