<kbd id="9plqc"><label id="9plqc"></label></kbd>

        <th id="9plqc"></th>
        1. <center id="9plqc"><video id="9plqc"></video></center>
          <sub id="9plqc"><form id="9plqc"><pre id="9plqc"></pre></form></sub>
          <nav id="9plqc"><form id="9plqc"><legend id="9plqc"></legend></form></nav>
          解決中文亂碼:字符編碼全攻略 您所在的位置:網(wǎng)站首頁 算命稱八字有多少重量的 解決中文亂碼:字符編碼全攻略

          解決中文亂碼:字符編碼全攻略

          2024-12-05 04:44| 來源: 網(wǎng)絡整理| 查看: 265

          13.2 中文亂碼及字符編碼全攻略

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

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

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

          什么是中文亂碼

          Q:什么是中文亂碼?

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

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

          什么是字符編碼

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

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

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

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

          1)ASCII

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

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

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

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

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

          阿拉伯數(shù)字,我們都很熟悉了。

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

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

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

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

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

          2)Unicode

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

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

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

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

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

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

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

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

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

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

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

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

          曾有人這樣說:

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

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

          3)UTF-8

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

          那怎么辦呢?

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

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

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

          具體的表現(xiàn)形式為:

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

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

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

          4)GB2312

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

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

          中文亂碼是如何出現(xiàn)的?

          Q:來一串出現(xiàn)中文亂碼的 demo,中文為沉默王二

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

          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);

          輸出結果:

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

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

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

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

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

          GPT4:

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

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

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

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

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

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

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

          8、總結經(jīng)驗:針對此次問題,總結經(jīng)驗教訓,分析問題產(chǎn)生的根本原因,優(yōu)化開發(fā)和測試流程,避免類似問題再次發(fā)生。

          GitHub 上標星 7600+ 的開源知識庫《二哥的 Java 進階之路》第一版 PDF 終于來了!包括Java基礎語法、數(shù)組&字符串、OOP、集合框架、Java IO、異常處理、Java 新特性、網(wǎng)絡編程、NIO、并發(fā)編程、JVM等等,共計 32 萬余字,可以說是通俗易懂、風趣幽默……詳情戳:太贊了,GitHub 上標星 7600+ 的 Java 教程

          微信搜 沉默王二 或掃描下方二維碼關注二哥的原創(chuàng)公眾號沉默王二,回復 222 即可免費領取。



          【本文地址】

          公司簡介

          聯(lián)系我們

          今日新聞

          推薦新聞

          專題文章
            CopyRight 2018-2019 實驗室設備網(wǎng) 版權所有
            黄色免费网站在线看,韩国精品在线观看,韩国美女一区二区,99国产热 宜宾县| 大名县| 太仓市| 邯郸县| 卢湾区| 株洲市| 无锡市| 延长县| 通山县| 东海县| 皮山县| 县级市| 萨嘎县| 和平县| 嵊州市| 长沙市| 兴隆县| 宜都市| 区。| 呼玛县| 沁阳市| 仁寿县| 溆浦县| 贡嘎县| 祁连县| 鄯善县| 师宗县| 静宁县| 岐山县| 临桂县| 永春县| 濉溪县| 双江| 纳雍县| 东方市| 鹤山市| 绥化市| 和硕县| 喀喇沁旗| 扎兰屯市| 兴仁县| http://444 http://444 http://444 http://444 http://444 http://444