Java實(shí)現(xiàn)UTF-8編碼與解碼方式
Java實(shí)現(xiàn)UTF-8編碼與解碼
Java代碼如下:
import java.net.URLDecoder; import java.net.URLEncoder; //URLDecoder.decode("%E5%A4%A9%E6%B4%A5","UTF-8"); public class URLDecoderTesT { ? ? public static void main(String[] args) throws Exception { ? ? ? ? ? // 將application/x-www-form-urlencoded字符串轉(zhuǎn)換成普通字符串 ? ? ? ? // 其中的字符串直接從上圖所示窗口復(fù)制過來,chrome 默認(rèn)用 UTF-8 字符集進(jìn)行編碼,所以也應(yīng)該用對(duì)應(yīng)的字符集解碼 ? ? ? ? System.out.println("采用UTF-8字符集進(jìn)行解碼:"); ? ? ? ? String keyWord = URLDecoder.decode("%E9%99%88", "UTF-8"); ? ? ? ? System.out.println(keyWord); // ? ? ? ?System.out.println("\n 采用GBK字符集進(jìn)行解碼:"); // ? ? ? ?System.out.println(URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "GBK")); //? // ? ? ? ?// 將普通字符串轉(zhuǎn)換成application/x-www-form-urlencoded字符串 ? ? ? ? System.out.println("\n 采用utf-8字符集:"); ? ? ? ? String urlStr = URLEncoder.encode("../../../../../../../etc/passwd", "utf-8"); ? ? ? ? System.out.println(urlStr); // ? ? ? ?System.out.println("\n 采用GBK字符集:"); // ? ? ? ?String urlStr2 = URLEncoder.encode("天津大學(xué)", "GBK"); // ? ? ? ?System.out.println(urlStr2); ? ? } }
推薦一個(gè)好的在線轉(zhuǎn)換網(wǎng)頁:https://www.bejson.com/enc/urlencode/
使用UTF-8或GBK編碼后還是亂碼的問題
大家在開發(fā)中可能經(jīng)常遇到將String字符串轉(zhuǎn)為byte[]的場(chǎng)景,為了避免中文亂碼,一般指定字符集為GBK或UTF-8來進(jìn)行編碼以及解碼,但是如果使用不當(dāng),同樣會(huì)造成字符集亂碼問題。
主要原因是進(jìn)行編碼以及解碼的字符集不一致導(dǎo)致
所以,在解決字符集亂碼問題時(shí)一般情況下會(huì)顯示指定編碼和解碼字符集。
// 編碼 byte[] bytes = “中文”.getBytes(“UTF-8”); // 解碼 new String(bytes,“UTF-8”);
不顯式指定時(shí)一般會(huì)使用默認(rèn)字符集進(jìn)行編碼或解碼,此時(shí)需要確保使用的獲取默認(rèn)字符集的方法一樣。
// 編碼 獲取默認(rèn)字符集方法為:Charset.defaultCharset().name() byte[] bytes =“中文”.getBytes(); // 解碼 獲取默認(rèn)字符集方法為:Charset.defaultCharset().name() new String(bytes);
以下列出兩種獲取默認(rèn)字符集的方法及區(qū)別:
Charset.defaultCharset().name();
System.getProperty("file.encoding")
兩者的區(qū)別是
**Charset.defaultCharset()**通過在JVM啟動(dòng)時(shí)通過-Dfile.encoding=UTF-8參數(shù)來進(jìn)行設(shè)置。此方式只支持在jvm啟動(dòng)時(shí)設(shè)置一次,不支持在運(yùn)行期修改。
System.getProperty(“file.encoding”) 獲取的是操作系統(tǒng)的編碼,可以通過System.setProperty("file.encoding","UTF-8")進(jìn)行修改(此修改不會(huì)影響操作系統(tǒng),重啟jvm后丟失),支持在運(yùn)行期修改。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單了解Spring循環(huán)依賴解決過程
這篇文章主要介紹了簡(jiǎn)單了解Spring循環(huán)依賴解決過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11解決阿里代碼規(guī)范檢測(cè)中方法缺少javadoc注釋的問題
這篇文章主要介紹了解決阿里代碼規(guī)范檢測(cè)中方法缺少javadoc注釋的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08IOC?容器啟動(dòng)和Bean實(shí)例化兩個(gè)階段詳解
這篇文章主要為大家介紹了IOC?容器啟動(dòng)和Bean實(shí)例化兩個(gè)階段詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項(xiàng)目的操作過程
這篇文章主要介紹了Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03Springboot中的@ConditionalOnBean注解詳細(xì)解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細(xì)解讀,@ConditionalOnMissingBean注解兩個(gè)類,一個(gè)Computer類,一個(gè)配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11spring?cloud?gateway中配置uri三種方式
gateway?組件是SpringCloud?組件中的網(wǎng)關(guān)組件,主要是解決路由轉(zhuǎn)發(fā)的問題,跟nginx有點(diǎn)類似,區(qū)別是nginx多用在前端上,gateway用在后端上,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-08-08Java配置JDK開發(fā)環(huán)境及環(huán)境變量
這篇文章主要為大家詳細(xì)介紹了Java配置JDK開發(fā)環(huán)境及環(huán)境變量,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09