你了解java中的幾種編碼方式?解決亂碼問題可能並不麻煩

2021-01-07 愚公要移山1

前言

編碼的轉換通常在IO機制中使用,一個好的編碼可以為我們節省很多空間,在某種程度上提高我們應用的效率。由於之前就知道String中的轉換方式,還有一些工具類,因此今天就好好的整理一下java中jdk提供的幾種轉換方式,希望對你有幫助。

一、編碼轉換原理

1、為什麼需要編碼

我們知道計算機存儲信息的最小單位是一個字節8位,能夠表示256個字符。這對於早起的英文來說足夠了。即使是加上一些常見符號也足夠。於是在1965年美國制定了ASCII編碼,主要用於英語和西歐語言,一開始128個,後來加到了256。

後來隨著時間的發展,中國、日本等國的計算機也開始蓬勃發展,於是計算機不僅僅要存儲英文了,也開始存儲中文。但是中文我們都知道幾萬個太多了,一個字節肯定放不下。怎麼辦呢?一個字節表示不下,那就多用幾個字節就好了。這樣不僅可以表示漢字,還可以避免了與ASCII編碼的衝突。這幾個字節在存儲的時候再轉化為bit,完美!劃重點哈,編碼解決的就是字節和字符之間的轉化問題。

2、編碼方式

既然是編碼,那些大佬早就考慮到了這些問題,並提拱了多種編碼方式,常見的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。它們規定了轉化的規則,按照這個規則就可以讓計算機正確的表示我們的字符。

像GB2312、GBK、UTF-8、UTF-16等很多種方式都可以表示漢字,他們有什麼區別呢?

(1)GB2312

它是雙字節編碼,總的編碼範圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。這個是中國1981年搞出來的。這種編碼是一個漢字兩個字節。

(2)GBK

它的編碼範圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字。這個是中國在1995年搞出來的,主要是用於GB2312編碼的補充。這種編碼依然是一個漢字兩個字節。

(3)Unicode

上面看到,中國可以做出了一個編碼,日本也可以做出來一個編碼,時間久了每個國家都有著自己的一套編碼,就不可避免的造成衝突。於是Unicode出來了,把所有語言統一起來合成一個規則。這種編碼是定長的字節數。

(4)UTF8

既然Unicode是定長的字節數,那麼存儲一個複雜的漢字可能需要三個字節,但是為了保證是2的冪數集,就會自動擴充為4個字節,別看著一個字節之差,存儲的字數多了就會極大的浪費空間。是於是而 UTF-8 採用了一種變長技術,每個編碼區域有不同的字碼長度。不同類型的字符可以是由 1~6 個字節組成。

以上這些編碼方式會為每一個漢字或者是字母建立一個編碼庫,在編碼的時候字母和編碼一一對應。

3、為什麼會出現亂碼?

這個問題就是因為編碼和解碼是採用了不同的或者是不兼容的編碼方案。比如一個用UTF-8編碼的後的字符。再用GBK去解碼,由於兩個字符集的編碼庫不一樣。同一個漢字在兩個編碼庫的位置也不一樣。於是就出現了亂碼。

4、java如何解決亂碼問題?

這個問題其實就是java中如何使用編碼規則,因為使用好了編碼規則。才可以很好地解決亂碼問題。

(1)IO流

編碼的目的上面已經說了,主要是字節和字符之間的轉化。既然涉及到字節和字符很容易我們就能想到java中的IO流。也就是說java中編碼的轉換其實就是IO流中的類來實現的。

最核心的就是上面幾個類,當然這裡只是給出了輸入的一部分,還有一些輸出的類。

(2)String

String類中也提供了一些轉碼的方法。下面我們會通過實例來說明。為什麼String可以實現呢?這是因為String底層保存的其實就是一個一個字節,而且String還有方法直接轉化為字符。所以String肯定也能實現。

(3)Charset

這個Charset是javaNIO中的一個類,整個流程就是讀取數據,然後轉化為byte,也就是字符。然後重新編碼成字符就OK了。

下面我們使用代碼來實現一下:

二、代碼實現

1、IO流

首先是IO流實現,這種通過輸入輸出流可以直接的指定編碼規則。

publicvoidconvertionFile()throws IOException {File file = new File("./愚公要移山.txt"); FileInputStream fis = new FileInputStream(file); InputStreamReader inReader = new InputStreamReader(fis, "gbk"); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter outReader = new OutputStreamWriter(fos, "utf-8");//這種輸入gbk,輸出utf-8肯定會出現錯誤 }

2、String

使用string是最方便的,代碼也比較簡潔,適用於字符串的編碼。

publicvoidconvertionString()throws UnsupportedEncodingException {String s = "愚公要移山,碼農飛上天";// 正常情況下轉碼的過程byte[] b = s.getBytes("gbk");// 編碼 String sa = new String(b, "gbk");// 解碼 System.out.println(sa);// 錯誤狀態下轉碼的過程 b = sa.getBytes("utf-8");// 編碼使用utf-8 sa = new String(b, "gbk");// 解碼使用gbk System.err.println(sa);}//控制臺輸出://愚公要移山,碼農飛上天//鎰氬叕瑕佺Щ灞憋紝鐮佸啘椋炰笂澶?

3、Charset

publicvoidconvertionCharset()throws IOException {Charset charset = StandardCharsets.UTF_8;// 從字符集中創建相應的編碼和解碼器 CharsetEncoder encoder = charset.newEncoder(); CharsetDecoder decoder = charset.newDecoder();// 構造一個buffer CharBuffer charBuffer = CharBuffer.allocate(64); charBuffer.put('A'); charBuffer.flip();// 將字符序列轉換成字節序列 ByteBuffer bb = encoder.encode(charBuffer);// 將字節序列轉換成字符序列 bb.flip(); CharBuffer cb = decoder.decode(bb);}

以上就是三種基本的實現方式,當然還有一些其他的,比如Spring中提供的編碼轉換工具等等。在這裡就不說了,因為技術太多,實現的方式也太多,我們就看這幾種即可。

相關焦點

  • Java中文亂碼解決之道:認識字符集
    ,每次遇到中文亂碼LZ要麼是按照以前的經驗修改,要麼則是baidu.com來解決問題。閱讀許多關於中文亂碼的解決辦法的博文後,發現對於該問題我們都(更加包括我自己)沒有一個清晰明了的認識,於是LZ想通過這系列博文(估計只有幾篇)來徹底分析、解決java中文亂碼問題,如有錯誤之處望各位同仁指出!
  • 字符集及其存儲方式(解決亂碼問題)
    閱讀大概需要4分鐘在我們進行文本挖掘或處理文檔時,都要面臨一個最最基本的問題->就是解決亂碼問題。
  • JavaWeb 亂碼問題終極解決方案!
    整體思路首先出現亂碼之後,要先去確認亂碼的地方,當一個網頁上出現亂碼,有可能是瀏覽器顯示問題,也有可能是 Java 編碼問題,也有可能資料庫中的數據本身就是亂碼的,所以我們要做的第一件事就是確認亂碼發生的位置,縮小 bug 範圍,通過列印日誌或者 debug 首先去確認亂碼發生的位置,然後再去進一步解決,一般來說,亂碼的原因大致上可以分為兩類:請求亂碼,可能是因為參數放在
  • stm32CubeIDE如何修改文檔編碼,來解決文本注釋亂碼問題
    .於是今天先不講技術問題了,說一個關於如何修改文檔編碼的小方法吧.stm32cubeIDE中,那很遺憾,你一定會遇到注釋亂碼的情況.如何能恢復正常的漢字顯示呢,這就是今天我要介紹的了.05最後總結值得注意的是,以上2種修改文件和整個項目文件編碼的方式,只適用於從keil5或者其他文檔複製到stm32cubeide
  • Java中文亂碼解決之道:字符編碼詳解
    一、基礎知識在了解各種字符集之前我們需要了解一些最基礎的知識,如:編碼、字符、字符集、字符編碼基礎知識。編碼計算機中存儲的信息都是用二進位表示的,我們在屏幕上所看到文字、圖片等都是通過二進位轉換的結果。
  • php中文亂碼問題的終極解決方案匯總
    閱讀文章前先來一套視頻教程,回復關鍵詞「320」領取很多新手朋友學習PHP的時候,發現程序中的中文在輸出的時候會出現亂碼的問題,那麼為什麼會出現這種亂碼的情況呢?一般來說,亂碼的出現有2種原因,一種是由於編碼(charset) 設置錯誤,導致瀏覽器以錯誤的編碼來解析,從而出現了滿屏亂七八糟的「天書」,第二種就是文件被以錯誤的編碼打開,然後保存,比如一個文本文件原先是GB2312編碼的,卻以UTF-8編碼打開再保存,就會出現亂碼的問題。本篇文章,就帶大家了解一下,怎麼解決php中亂碼的問題。
  • word打開是亂碼怎麼辦?word文檔打開出現亂碼的解決技巧
    word是我們最常使用的辦公軟體了,最近一位Win7用戶反應,word文檔打開是亂碼,漢語部分沒有亂碼,而編程代碼(java代碼)亂碼了,這是怎麼回事呢?出現這種情況,說明該word文檔使用了不同的編碼方式或格式,而漢語的編碼方式剛好和word相一致罷了。那麼,該如何解決word文檔打開出現亂碼的問題呢?
  • 用chardect庫解決網頁亂碼問題
    一、實驗目的我們的目的是學會使用chardect庫,對亂碼內容進行處理。本文會以一個具體的例子,通過實戰的方式獲取正確編碼的數據。這就是我們今天要克服的問題-html編碼問題。遇到這種問題問題,我們可能會先在html標籤中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。
  • 解決Excel打開文件亂碼的問題
    今天用公司的CMS導出了一個CSV數據文件,需要在Excel中處理並打開,但是我直接用Excel打開這個CSV文件卻發現,文件中的所有中文字符都變成了亂碼
  • iPad郵件亂碼怎麼辦_iPad郵件亂碼解決教程
    iPad郵件亂碼怎麼辦_iPad郵件亂碼解決教程 2014-07-31 10:38 | 作者:SORA | 來源:265G QQ群號:624022706
  • SPSS基礎:【09】數據文件亂碼解決辦法
    有時候,我們打開從其他人那裡或者網上下載的spss格式的數據文件會出現亂碼。為什麼會出現亂碼呢?如何解決亂碼問題呢?一、為什麼會出現亂碼?數據文件在存儲時,一般都有對應的編碼方式,我將它稱為存儲編碼。同樣SPSS軟體在打開數據時,也會用預先設置好的編碼方式去解析數據文件中的數據,此處的編碼我將它稱為打開編碼。如果存儲編碼和打開編碼不一致,那麼就有可能出現亂碼。為什麼說有可能,而不是一定會亂碼呢?
  • 如何解決MapInfo打開文字亂碼的問題
    在使用MapInfo的過程中有時候會遇到這樣的情況,由於文字中有韓語、日語或者阿拉伯語等文字的時候會顯示為亂碼或者問號,這主要是文字編碼的問題,這裡以shp格式的數據轉換為tab格式為例,介紹一下解決的方法。
  • python 爬蟲文檔編碼概述,大家都能看懂,有助解決亂碼問題
    很多情況下我們在爬取網頁時,response回來的html自己看不懂,一堆亂碼,這就涉及到編碼的問題,借著大家的疑問,來闡述一下編碼怎麼來的。怎麼去解決它。有種觀點認為,網際網路基本上就是那些符合新式 Web 2.0 潮流,並且經過多媒體內容點綴的 HTML 網站構成的集合,這些內容在網頁抓取時幾乎都是可以忽略的。
  • 用ua命令來解決文件亂碼問題
    在上篇推文中,我們用Stata中的import delimited的encoding 選項來解決亂碼問題。除了這種方法,Stata也提供了一組unicode命令,可以幫助我們對於一個文件或者一個文件夾下的多個文件進行轉碼以解決亂碼問題。我們可以試一下,對上述文件先進行轉碼後再讀入。
  • 第09期:有關 MySQL 字符集的亂碼問題
    那麼數據亂碼問題在這兒顯得就非常簡單了,或許說可能不會出現這樣的問題。數據之所以會亂碼,在 MySQL 裡無非有以下幾類情況:在數據寫入到表的過程中轉碼失敗,資料庫端也沒有進行恰當的處理,導致存放在表裡的數據亂碼。針對這種情況,前幾篇文章介紹過客戶端發送請求到服務端。其中任意一個編碼不一致,都會導致表裡的數據存入不正確的編碼而產生亂碼。
  • Java開發之淺談ZIP壓縮中要注意的幾點
    目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放源碼的7-Zip格式。從性能上比較,RAR格式較ZIP格式壓縮率較高,但是它的壓縮時間遠遠高於Zip。在日常java開發中,經常會用到將一個文件夾或文件夾中的內容壓縮成一個zip包,這裡我們就從以下幾個需要注意的事項入手,談一談java如何開發zip壓縮類。
  • 自己動手 教你解決AKAIO金手指亂碼問題
    內容分享:jy02351812  AK自製內核AKAIO因為更新快,功能多受到不少AK燒錄卡用戶的青睞,但是由於內核的編碼問題,導致AK本身的金手指包括兼容的R4金手指文件在AKAIO內核上顯示亂碼。
  • 文件打開亂碼?來了解一下文件編碼!
    我們採用了如下幾種編碼方式:1、 GB2312漢字編碼:為了適應計算機處理漢字信息的需要,1981年我國頒布了第一個國家標準——《信息交換用漢字編碼字符集·····基本集》(GB2312).該標準選出了6763個常用漢字和682個非漢字圖形字符。
  • 解決idea控制臺中文亂碼問題
    可是有時候會遇到中文亂碼問題。本文將介紹大家,怎麼解決idea的控制臺中文亂碼情況。請看亂碼信息:程序報錯了。可是控制臺又亂碼了,怎麼解決呢?一:設置所有文件都是UTF-8編碼。具體:左上角:File-->settings-->Editor-->File Encodings 將所有編碼都設置為UTF-8模式二:修改idea配置文件IDEA安裝目錄,將2個idea64.exe.vmoptions、idea.exe.vmoptions
  • Content-Disposition 亂碼問題記錄
    剛開始以為是 Docker 內字符編碼的問題,因為隨便百度一下,都能看到很多反映容器環境下的應用輸出中文日誌亂碼的問題。但是,通過在容器內創建中文名稱的文件,以及 curl 命令請求文件header的方式,都驗證出官方提供的 Python3.6 鏡像實際上是支持中文的。