IO流:java中解碼和編碼出現(xiàn)亂碼說明以及代碼實(shí)現(xiàn)方法
一、UTF-8和GBK編碼方式
- 如果采用的是UTF-8的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占3個(gè)字節(jié)
- 如果采用GBK的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占2個(gè)字節(jié)
二、idea和eclipse的默認(rèn)編碼方式
其實(shí)idea和eclipse的默認(rèn)編碼方式是不一樣的哦。
idea默認(rèn)的編碼方式是:UTF-8
eclipse默認(rèn)采用的編碼方式是GBK
三、解碼和編碼方法
1、java中編碼的方法
- public byte[] getBytes() 使用默認(rèn)的編碼方式進(jìn)行編碼
- public byte[] getBytes(Charset charset) 使用指定方式進(jìn)行編碼
2、java中解碼的方法
- public String(byte bytes[]) 使用默認(rèn)的方式進(jìn)行解碼
- public String(byte bytes[], String charsetName) 使用指的方式進(jìn)行解碼
四、代碼實(shí)現(xiàn)
以下代碼demo均采用idea開發(fā)哦
編碼
1、使用默認(rèn)的編碼方式進(jìn)行編碼看下面這段代碼,請(qǐng)猜一猜數(shù)組中的元素有幾個(gè)?
package com.heima.demo; import java.util.Arrays; public class TestDemo { public static void main(String[] args) { String str = "dk你好"; byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes)); } }
你答對(duì)了嗎?數(shù)組中一共有8個(gè)元素,因?yàn)閕dea默認(rèn)采用的編碼方式是utf-8,如果采用的是UTF-8的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占3個(gè)字節(jié)。我們看一下運(yùn)行結(jié)果
[100, 107, -28, -67, -96, -27, -91, -67]
Process finished with exit code 0
如果使用指定的編碼方式GBK進(jìn)行編碼呢?我們看一下代碼
public class TestDemo { public static void main(String[] args) throws UnsupportedEncodingException { String str = "dk你好"; byte[] bytes = str.getBytes("gbk"); System.out.println(Arrays.toString(bytes)); } }
答案是:數(shù)組元素一共有6個(gè),因?yàn)椴捎玫氖荊BK編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占2個(gè)字節(jié)。
我們看一下運(yùn)行結(jié)果
[100, 107, -60, -29, -70, -61]
Process finished with exit code 0
解碼
1、使用默認(rèn)的方式進(jìn)行解碼
package com.heima.demo; import java.io.UnsupportedEncodingException; public class TestDemo { public static void main(String[] args) throws UnsupportedEncodingException { String str = "dk你好"; byte[] byte1 = str.getBytes(); String res1 = new String(byte1); System.out.println(res1); } }
運(yùn)行結(jié)果如下:
dk你好
Process finished with exit code 0
如果給他加上指定編碼方式呢?
package com.heima.demo; import java.io.UnsupportedEncodingException; public class TestDemo { public static void main(String[] args) throws UnsupportedEncodingException { String str = "dk你好"; byte[] byte1 = str.getBytes(); String res1 = new String(byte1,"gbk"); System.out.println(res1); } }
運(yùn)行結(jié)果
dk浣犲ソ
Process finished with exit code 0
我們發(fā)現(xiàn)有亂碼產(chǎn)生。那為什么呢?因?yàn)榫幋a的時(shí)候,采用的是默認(rèn)的utf-8方式,所以解碼的時(shí)候,也需要使用utf-8進(jìn)行解碼,如果使用gbk就會(huì)產(chǎn)生亂碼。因?yàn)閡tf-8和gbk對(duì)中文所占的字節(jié)數(shù)是不一樣的。
- 如果采用的是UTF-8的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占3個(gè)字節(jié)
- 如果采用GBK的編碼方式,那么1個(gè)英文字母 占 1個(gè)字節(jié),1個(gè)中文占2個(gè)字節(jié)
五、額外知識(shí)擴(kuò)展
1、什么是字符集?字符集顧名思義,就是用來裝多個(gè)字符的集合。不同的字符集中字符的個(gè)數(shù)是不同的,包含的字符也是不同的,甚至對(duì)于字符的編碼格式也是不同的。
2、什么是字符編碼?計(jì)算機(jī)中存儲(chǔ)信息都是以二進(jìn)制數(shù)表示的,而我們?cè)陔娔X屏幕上看到的文字、數(shù)字、英文、標(biāo)點(diǎn)符號(hào)等都是將二進(jìn)制數(shù)轉(zhuǎn)換過后的結(jié)果,按照某種規(guī)則,將計(jì)算機(jī)中的二進(jìn)制數(shù)與某個(gè)抽象字符集合一一對(duì)應(yīng),這就是字符編碼。
3、ASCII字符集ASCII 全稱 (American Standard Code for Information Interchange)美國(guó)信息交換標(biāo)準(zhǔn)代碼,它是基于拉丁字母的一套電腦編碼系統(tǒng),其最初在創(chuàng)建的時(shí)候主要是為了顯示英語以及一些西歐語言,是國(guó)際通用的信息交換使用標(biāo)準(zhǔn)碼。ASCII使用了7位二進(jìn)制來表示128個(gè)字符和符號(hào),目前已經(jīng)停止更新。
4、Unicode字符集ASCII字符集只包含了128個(gè)字符,對(duì)于全世界的所有語言來說,并不能容納下世界上所有的語言。所以Unicode字符集出現(xiàn)了。
Unicode又被稱為統(tǒng)一碼、萬國(guó)碼,是國(guó)際組織制定的用來容納全世界字符的編碼方案。是的,確切的說Unicode是一種編碼方案,以實(shí)現(xiàn)跨語言、跨平臺(tái)的文本處理、轉(zhuǎn)換的要求。
但是Unicode只是一種字符與二進(jìn)制數(shù)之間的一種邏輯映射編碼,它并沒有指定在計(jì)算集中應(yīng)該如何的進(jìn)行存儲(chǔ)。所以此時(shí)就需要一種編碼格式用來指定Unicode字符集中的字符是如何進(jìn)行編碼的。
在Unicode官方資料中,Unicode編碼方式有三種:UTF-8、UTF-16、UTF-32,而其中UTF-8編碼成為了現(xiàn)今互聯(lián)網(wǎng)使用較多的編碼方式。
5、GB2312GB2312編碼是第一個(gè)漢字編碼國(guó)家標(biāo)準(zhǔn),于1980年由中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布。其中共收錄了漢字6763個(gè)。但是由于我國(guó)的漢字非常多,GB2312收錄的漢字不夠用了,所以GBK誕生了。GBK包含了GB2312的所有內(nèi)容的同時(shí)還新增了20000多新的漢字,對(duì)于一些日常需求已經(jīng)為完全夠用了。
總結(jié)
到此這篇關(guān)于java中解碼和編碼出現(xiàn)亂碼說明以及代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java解碼和編碼亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot整合spring-boot-starter-data-elasticsearch的過程
本文詳細(xì)介紹了Springboot整合spring-boot-starter-data-elasticsearch的過程,包括版本要求、依賴添加、實(shí)體類添加、索引的名稱、分片、副本設(shè)置等,同時(shí),還介紹了如何使用ElasticsearchRepository類進(jìn)行增刪改查操作2024-10-10Spring Data JPA 簡(jiǎn)單查詢--方法定義規(guī)則(詳解)
下面小編就為大家?guī)硪黄猄pring Data JPA 簡(jiǎn)單查詢--方法定義規(guī)則(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Java單元測(cè)試Powermockito和Mockito使用總結(jié)
公司單元測(cè)試框架選用了Junit 4.12,Mock框架選用了Mockito和PowerMock,本文主要介紹了Java單元測(cè)試Powermockito和Mockito使用總結(jié),感興趣的可以了解一下2021-09-09關(guān)于@Value注入List,Map及設(shè)置默認(rèn)值問題
這篇文章主要介紹了@Value注入List,Map及設(shè)置默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java經(jīng)典排序算法之插入排序代碼實(shí)例
這篇文章主要介紹了Java經(jīng)典排序算法之插入排序代碼實(shí)例,插入排序是一種最簡(jiǎn)單直觀的排序算法,它的工作原理是通過構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入,需要的朋友可以參考下2023-10-10SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例
由于短鏈接可能涉及到用戶隱私和安全問題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護(hù)和安全標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下2023-09-09