解決中文亂碼:字符編碼全攻略 - ASCII、Unicode、UTF-8、GB2312詳解

🧑 博主簡介:CSDN博客專家歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編程高并發設計Springboot和微服務,熟悉LinuxESXI虛擬化以及云原生Docker和K8s,熱衷于探索科技的邊界,并將理論知識轉化為實際應用。保持對新技術的好奇心,樂于分享所學,希望通過我的實踐經歷和見解,啟發他人的創新思維。在這里,我希望能與志同道合的朋友交流探討,共同進步,一起在技術的世界里不斷學習成長。
技術合作請加本人wx(注明來自csdn):foreast_sea

在這里插入圖片描述


在這里插入圖片描述

文章目錄

  • 解決中文亂碼:字符編碼全攻略 - ASCII、Unicode、UTF-8、GB2312詳解
      • 什么是中文亂碼
      • 什么是字符編碼
        • 1)ASCII
        • 2)Unicode
        • 3)UTF-8
        • 4)GB2312
      • 中文亂碼是如何出現的?
      • 如何解決中文亂碼呢?

解決中文亂碼:字符編碼全攻略 - ASCII、Unicode、UTF-8、GB2312詳解

就在昨天,我在官網看到這樣一張截圖,有球友反饋說支付寶的理財頁面出現了中文亂碼,估計不少小伙伴和我一樣,都驚呆了😮!阿里這種大廠還能出現這種低級錯誤?

難道昨天的人力都投入到“通義千問”的突然發布上了?

那借這個機會,我就來和大家探討一下,中文亂碼是怎么出現的,以及如何快速解決亂碼問題。

什么是中文亂碼

Q:什么是中文亂碼?

GPT4:中文亂碼是指在計算機系統或軟件中,由于字符編碼不一致或處理不當,導致中文字符無法正常顯示,出現亂碼現象。這種現象通常表現為中文字符被替換成其他不相關的字符、符號或亂碼。

比如說,歷史上著名的“錕斤拷”同學,就是中文亂碼的絕佳代言人。

什么是字符編碼

Q:那什么是字符編碼呢?

GPT4:字符編碼(Character Encoding)是一種規則或約定,它將字符(如字母、數字、標點符號等)映射到計算機中的二進制數據。簡單來說,字符編碼就是將人類可讀的字符轉換為計算機可以處理的二進制數據的過程。

對于計算機來說,只認 0 和 1,所有的信息最終都是一個二進制數。一個二進制數要么是 0,要么是 1。8 個二進制數放在一起是一個字節,就會組合出 256 種狀態,也就是 2 的 8 次方(2^8),從 00000000 到 11111111。

為了讓計算機能夠識別和處理各種字符,需要使用字符編碼來對字符進行編碼和解碼。常見的字符編碼包括 ASCII、UTF-8、UTF-16、GBK、GB2312 等。

1)ASCII

ASCII 碼由電報碼發展而來,第一版標準發布于 1963 年,最后一次更新則是在 1986 年,至今為止共定義了 128 個字符。其中 33 個字符無法顯示在一般的設備上,需要用特殊的設備才能顯示。

ASCII 碼的局限在于只能顯示 26 個基本拉丁字母、阿拉伯數字和英式標點符號,因此只能用于顯示現代美國英語,對于其他一些語言則無能無力,比如在法語中,字母上方有注音符號,它就無法用 ASCII 碼表示。

PS:拉丁字母(也稱為羅馬字母)是多數歐洲語言采用的字母系統,是世界上最通行的字母文字系統,是羅馬文明的成果之一。

雖然名稱上叫作拉丁字母,但拉丁文中并沒有用 J、U 和 W 這三個字母。

在我的印象中,可能說拉丁字母多少有些陌生,說英語字母可能就有直觀的印象了。

阿拉伯數字,我們都很熟悉了。

但是,阿拉伯數字并非起源于阿拉伯,而是起源于古印度。學過歷史的你應該有一些印象,阿拉伯分布于西亞和北非,以阿拉伯語為主要語言,以伊斯蘭教為主要信仰。

處在這樣的地理位置,做起東亞和歐洲的一些生意就很有優勢,于是阿拉伯數字就由阿拉伯人傳到了歐洲,因此得名。

英式標點符號,也叫英文標點符號,和中文標點符號很相近。標點符號是輔助文字記錄語言的符號,是書面語的組成部分,用來表示停頓、加強語氣等。

英文標點符號在 16 世紀時,分為朗誦學派和句法學派,主要由古典時期的希臘文和拉丁文演變而來,在 17 世紀后進入穩定階段。俄文的標點符號依據希臘文而來,到了 18 世紀后也采用了英文標點符號。

在很多人的印象中,古文是沒有標點符號的,但管錫華博士研究指出,中國早在先秦時代就有標點符號了,后來融合了一些英文標點符號后,逐漸形成了現在的中文標點符號。

2)Unicode

這個世界上,除了英語,還有法語、葡萄牙語、西班牙語、德語、俄語、阿拉伯語、韓語、日語等等等等。ASCII 碼用來表示英語是綽綽有余的,但其他這些語言就沒辦法了。

像我的主人二哥的母語——中文,就博大精深,與其對應的漢字數量很多很多,東漢的《說文解字》收字 9353 個,清朝《康熙字典》收字 47035 個,當代的《漢語大字典》收字 60370 個。1994 年中華書局、中國友誼出版公司出版的《中華字海》收字 85568 個。

常用字大概 2500 個,次常用字 1000 個。

一個字節只能表示 256 種符號,所以如果拿 ASCII 碼來表示漢字的話,是遠遠不夠用的,那就必須要用更多的字節。簡體中文常見的編碼方式是 GB2312,使用兩個字節表示一個漢字,理論上最多可以表示 256 x 256 = 65536 個符號。

要知道,世界上存在著多種編碼方式,同一個二進制數字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。

  • 編碼就是將原始數據(比如說文本、圖像、視頻、音頻等)轉換為二進制形式。
  • 解碼就是將二進制數據轉換為原始數據,是一個反向的過程。

如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會徹底消失。

這個艱巨的任務由誰來完成呢?Unicode,中文譯作萬國碼、國際碼、統一碼、單一碼,就像它的名字都表示的,這是一種所有符號的編碼。

Unicode 至今仍在不斷增修,每個新版本都會加入更多新的字符。目前最新的版本為 2020 年 3 月公布的 13.0,收錄了 13 萬個字符。

Unicode 是一個很大的集合,現在的規模可以容納 100 多萬個符號。每個符號的編碼都不一樣,比如,U+0639表示阿拉伯字母 AinU+0041 表示英語的大寫字母 AU+4E25 表示漢字

具體的符號對應表,可以查詢:

  • unicode.org:http://www.unicode.org
  • 漢字對應表:ttp://www.chi2ko.com/tool/CJK.htm

曾有人這樣說:

Unicode 支持的字符上限是 65536 個,Unicode 字符必須占兩個字節。

但這是一種誤解,記住,Unicode 只是一個用來映射字符和數字的標準。它對支持字符的數量沒有限制,也不要求字符必須占兩個、三個或者其它任意數量的字節,所以它可以無窮大。

3)UTF-8

Unicode 雖然統一了全世界字符的編碼,但沒有規定如何存儲。如果統一規定的話,每個符號就要用 3 個或 4 個字節表示,因為 2 個字節只能表示 65536 個,根本表示不全。

那怎么辦呢?

UTF(Unicode Transformation Formats,Unicode 的編碼方式)來了!最常見的就是 UTF-8 和 UTF-16。

在 UTF-8 中,0-127 號的字符用 1 個字節來表示,使用和 ASCII 相同的編碼。只有 128 號及以上的字符才用 2 個、3 個或者 4 個字節來表示。

如果只有一個字節,那么最高的比特位為 0;如果有多個字節,那么第一個字節從最高位開始,連續有幾個比特位的值為 1,就使用幾個字節編碼,剩下的字節均以 10 開頭。

具體的表現形式為:

  • 0xxxxxxx:一個字節;
  • 110xxxxx 10xxxxxx:兩個字節編碼形式(開始兩個 1);
  • 1110xxxx 10xxxxxx 10xxxxxx:三字節編碼形式(開始三個 1);
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字節編碼形式(開始四個 1)。

也就是說,UTF-8 是一種可變長度的編碼方式——這是它的優勢也是劣勢。

怎么講呢?優勢就是它包羅萬象,劣勢就是浪費空間。舉例來說吧,UTF-8 采用了 3 個字節(256*256*256=16777216)來編碼常用的漢字,但常用的漢字沒有這么多,這對于計算機來說,就是一種嚴重的資源浪費。

4)GB2312

基于這樣的考慮,中國國家標準總局于 1980 年發布了 GB2312 編碼,即中華人民共和國國家標準簡體中文字符集。GB2312 標準共收錄 6763 個漢字(2 個字節就夠用了),其中一級漢字 3755 個,二級漢字 3008 個;同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的 682 個字符。

GB2312 的出現,基本滿足了漢字的計算機處理需求。對于人名、古漢語等方面出現的罕用字和繁體字,GB2312 不能處理,就有了 GBK(K 為“擴展”的漢語拼音(kuòzhǎn)第一個聲母)。

中文亂碼是如何出現的?

Q:來一串出現中文亂碼的 demo,中文為沉默王二

GPT4:下面是一個可能導致中文亂碼的示例。首先使用 GBK 編碼將中文字符串 “沉默王二” 轉換為字節數組,然后使用 UTF-8 編碼將字節數組轉回字符串。這將導致字符串在解碼時出現亂碼。

public class EncodingDemo {public static void main(String[] args) {String originalStr = "沉默王二";String encodedStr = "";try {byte[] bytes = originalStr.getBytes("GBK");encodedStr = new String(bytes, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println("轉碼前: " + originalStr);System.out.println("轉碼后: " + encodedStr);}
}

程序會輸出什么呢?

轉碼前: 沉默王二
轉碼后: ��?����

嘿嘿,亂碼來了!在 Unicode 中,� 是一個特殊的符號,它用來表示無法顯示,它的十六進制是 0xEF 0xBF 0xBD。那么兩個 �� 就是 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD,如果用 GBK 進行解碼的話,就是大名鼎鼎的“錕斤拷”。

可以通過代碼來驗證一下:

// 輸出 efbfbdefbfbd
char[] kuijinkao = HexUtil.encodeHex("��", StandardCharsets.UTF_8);
System.out.println(kuijinkao);
// 借助 hutool 轉成二進制
byte[] testBytes = HexUtil.decodeHex(kuijinkao);
// 使用 GBK 解碼
String testResult = new String(testBytes, Charset.forName("GBK"));
// 輸出錕斤拷
System.out.println(testResult);

來看一下輸出結果:

efbfbdefbfbd
錕斤拷

所以,以后再見到錕斤拷,第一時間想到 UTF-8 和 GBK 的轉換問題準沒錯。

如何解決中文亂碼呢?

Q:如何解決中文亂碼呢?

GPT4:解決中文亂碼問題需要確保在編碼和解碼過程中使用相同的字符編碼。這是一個修改過的示例,展示了如何避免中文亂碼問題:

String originalStr = "沉默王二";byte[] bytes = originalStr.getBytes(StandardCharsets.UTF_8);
String encodedStr = new String(bytes, StandardCharsets.UTF_8);System.out.println("正確轉碼前: " + originalStr);
System.out.println("正確轉碼后: " + encodedStr);

輸出結果:

正確轉碼前: 沉默王二
正確轉碼后: 沉默王二

除此之外,以下是一些避免亂碼的實踐:

  • 使用統一的字符編碼,如 UTF-8。它包含了所有 Unicode 字符,并且廣泛支持。確保在所有平臺和系統上使用相同的編碼。
  • 在處理文本文件時,始終明確指定字符編碼。例如,在 Java 中使用 InputStreamReader、OutputStreamWriter 時,指定編碼參數。
  • 在 HTML、XML 等文檔中,指定字符編碼。例如,在 HTML 頁面中添加 <meta charset="UTF-8">
  • 對于數據庫,確保使用正確的字符集。在創建數據庫和表時,明確指定字符集,如 utf8mb4。

當與第三方服務通信時,確保雙方使用相同的字符編碼。在處理 API 請求和響應時,檢查字符編碼是否匹配。

Q:針對支付寶這種生產環境事故,如何快速定位并解決問題呢?

GPT4:

1、收集信息:了解問題的具體表現,例如哪些頁面或功能受到影響,問題的嚴重程度,以及用戶反饋。這將有助于快速定位問題范圍。

2、檢查日志:查看服務器日志和應用程序日志,檢查是否存在異常信息或錯誤。日志信息有助于識別問題發生的時間和具體原因。

3、復現問題:在測試環境中嘗試復現問題,以便更深入地了解問題細節。如果無法復現問題,可能需要進一步收集生產環境的詳細信息。

4、定位問題:根據收集到的信息,確定問題可能發生的代碼或系統部分。檢查相關代碼,特別是涉及字符編碼、數據傳輸、數據庫操作的部分。

5、解決問題:修復問題代碼,確保字符編碼在整個系統中保持一致。進行單元測試和集成測試,驗證問題是否已解決。

6、部署修復:將修復后的代碼部署到生產環境。為了避免影響正常服務,可以考慮先在一個小規模的生產環境中進行驗證,然后逐步擴大部署范圍。

7、監控:在修復后持續關注系統運行狀況,確保問題已得到解決。收集用戶反饋,確認用戶滿意度。

8、總結經驗:針對此次問題,總結經驗教訓,分析問題產生的根本原因,優化開發和測試流程,避免類似問題再次發生。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78030.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

體系學習1:C語言與指針1——預定義、進制打印、傳參為數組

1、不對一段代碼進行編譯 #if 0 statement #endif2、輸出地址 int d[3]{1,2,3}; printf("%p",(void*)d);//p期待的是void*類型的數據3、不同進制的打印 int data 1200; char hed[9];//為\0預留位置&#xff01;&#xff01;&#xff01; sprintf(hed,"%08X&…

Java 基礎--數組(Array):存儲數據的“排排坐”

作者&#xff1a;IvanCodes 發布時間&#xff1a;2025年5月1日&#x1f913; 專欄&#xff1a;Java教程 大家好&#xff01;&#x1f44b; 咱們在編程時&#xff0c;經常需要處理一批相同類型的數據&#xff0c;比如班級里所有同學的成績 &#x1f4af;、一周每天的最高氣溫 …

CSS常用屬性_(進階)

目錄 1.尺寸單位與顏色 &#xff08;1&#xff09;尺寸 &#xff08;2&#xff09;顏色 常用2種 &#xff08;3&#xff09;顏色屬性值&#xff08;透明度&#xff09; 例如&#xff1a; 2.字體屬性font 例如&#xff1a; **順序 3.文本屬性 ?編輯例如&#xff1a; …

【RabbitMQ】保證消息不丟失

要確保 RabbitMQ 在消費者&#xff08;Python 服務&#xff09;重啟或掛掉時消息不丟失&#xff0c;需結合 消息持久化、確認機制&#xff08;ACK&#xff09; 和 死信隊列&#xff08;DLX&#xff09; 實現高可靠性&#xff1a; 1. 消息持久化&#xff08;Durability&#xff…

Python基本語法(控制語句)

#控制語句 Python語言的控制語句和其他編程語言類似&#xff0c;常用的有if…else、while、for語句。 案例2一7控制語句 第1組代碼&#xff0c;說明if-else語句&#xff1a; #1 print(\n1,if) x,y,z10,20,5 if x>y:print(x>y) else:print(x<y)輸出結果: 1,if x<…

并發設計模式實戰系列(10):Balking(猶豫模式)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天為大家帶來的是并發設計模式實戰系列&#xff0c;第10章Balking&#xff08;猶豫模式&#xff09;&#xff0c;廢話不多說直接開始~ 目錄 一、核心原理深度拆解 1. 狀態守護機制 2. 與狀態模式的…

【強化學習系列】貝爾曼方程

首先回顧狀態價值函數和動作價值函數的定義&#xff1a; 狀態價值函數 v π ( s ) v_\pi(s) vπ?(s)是從狀態 s s s出發&#xff0c;直至一幕結束后獲得的回報的期望值 動作價值函數 q π ( s , a ) q_\pi(s,a) qπ?(s,a)是從狀態 s s s出發&#xff0c;采取動作 a a a后&…

donet使用指定版本sdk

ps:來自微軟官方方案,實測可行,就是在項目任意目錄下在新建 global.json,并配置sdk版本 SDK 使用最新安裝的版本 SDK 命令包括 dotnet new 和 dotnet run。 .NET CLI 必須為每個 dotnet 命令選擇一個 SDK 版本。 即使在以下情況下&#xff0c;它也會默認使用計算機上安裝的最新…

x-cmd install | Orbiton:極簡至上的終端文本編輯器與輕量級 IDE

目錄 核心特點安裝適用場景優勢 厭倦了臃腫復雜的 IDE&#xff1f;渴望一個輕巧、快速、專注的編碼環境&#xff1f;Orbiton&#xff0c;一款極簡主義的終端文本編輯器與輕量級 IDE&#xff0c;將帶給你前所未有的編碼體驗。 核心特點 極簡主義&#xff0c;專注編碼&#xff1…

大腦、機器人與貝葉斯信念及AI推理

在機器不再局限于重復性任務的世界里&#xff0c;機器人技術已經大膽地邁入了感知、學習和決策的領域。這篇文章探討了智能機器人系統是如何構建的——從理解它們嘈雜的傳感器和不確定的環境&#xff0c;到使它們能夠做出明智的選擇并隨著時間的推移調整自己的行為。 AI推理 …

線上婚戀相親小程序源碼介紹

?基于ThinkPHP、FastAdmin和UniApp開發的線上婚戀相親小程序源碼&#xff0c;這款小程序源碼采用了ThinkPHP作為后端框架&#xff0c;其強大的功能與良好的擴展性為程序的穩定運行提供了保障。 ?FastAdmin作為后臺管理框架&#xff0c;使得管理員能夠便捷地對用戶信息、相親…

長短期記憶(LSTM)簡介

RNN 的主要限制在于它無法記住很長的序列&#xff0c;并且會陷入梯度消失的問題。 什么是梯度消失問題&#xff1f; 當添加更多具有某些激活函數的層時&#xff0c;神經網絡中損失函數的梯度趨近于零&#xff0c;這使得網絡難以訓練。 長短期記憶&#xff08;LSTM&#xff09;…

JESD204B 探究

JESD204B協議是高速串行接口標準,主要用于ADC/DAC與邏輯器件(如FPGA)之間的數據傳輸。以下為綜合解析: 一、協議概述 ?核心作用? 通過高速SERDES技術實現數模轉換器與邏輯器件間的高效數據傳輸,支持多通道同步和確定性延遲,適用于GB級吞吐量場景23。?版本演進? JESD2…

Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自動進入PIP Mode

接上文 Flutter PIP 插件 ---- Android 項目地址 PIP&#xff0c; pub.dev也已經同步發布 pip 0.0.3&#xff0c;你的加星和點贊&#xff0c;將是我繼續改進最大的動力 開發文檔 Add videos using picture-in-picture (PiP)介紹PIP功能從 Android 8.0 (API level 26) 引入&…

【Java開發日記】6個Java 工具,輕松分析定位 JVM 問題 !

目錄 使用 JDK 自帶工具查看 JVM 情況 jps jinfo jvisualvm jcm 使用 JDK 自帶工具查看 JVM 情況 JDK 自帶了很多命令行甚至是圖形界面工具&#xff0c;幫助查看 JVM 的一些信息。比如&#xff0c;在機器上運行 ls 命令&#xff0c;可以看到 JDK 8 提供了非常多的工具或程…

動態規劃簡單題2

leetcode91題&#xff08;解碼方法&#xff09; 分析題目&#xff1a; 1.這是一種解碼&#xff0c;就是給多個數字組成的字符串&#xff0c;把這些數字解碼成字母&#xff0c;看看一共有多少種 2.如果一個數字前有前導0就不合法&#xff0c;比如06&#xff0c;這與6不同&…

(007)Excel 公式的使用

文章目錄 邏輯運算公式的參數常用函數引用方式引用工作表和工作簿表格的引用修改公式的計算時機區域交叉引用 邏輯運算 公式的參數 單元格引用&#xff1a;SUM(A1:A24)。字面值&#xff1a;SQRT(121)。字面文本字符串&#xff1a;PROPER(“john.f.smith”)。表達式&#xff1a…

Unity 和 Unreal Engine(UE) 兩大主流游戲引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 兩大主流游戲引擎的核心使用方法和對比分析&#xff0c;幫助開發者快速上手并根據項目需求選擇合適工具&#xff1a; 一、Unity 使用指南 1. 安裝與配置 安裝&#xff1a;從 Unity Hub 下載&#xff0c;選擇長期支持…

猜數字游戲:從數學原理到交互體驗的完整設計指南

目錄 猜數字游戲&#xff1a;從數學原理到交互體驗的完整設計指南引言第一章 游戲數學原理1.1 均勻分布與隨機生成1.2 最優猜測策略 第二章 游戲系統設計2.1 核心架構2.2 動態難度系統 第三章 交互設計細節3.1 輸入驗證系統3.2 漸進式提示機制 第四章 進階功能設計4.1 智能輔導…

2025工業大模型白皮書 | 螞蟻工廠北京航空航天大學聯合出品

由螞蟻工廠與北京航空航天大學聯合發布的《2025工業大模型白皮書》是一部針對工業領域大模型技術發展的前瞻性研究報告。該白皮書系統梳理了工業大模型的技術演進、核心應用場景、關鍵挑戰及未來發展趨勢&#xff0c;旨在為制造業數字化轉型提供理論支撐和實踐指南。作為產學研…