Java字符串編碼知識點(diǎn)詳解介紹
在 Java 中,當(dāng)我們處理String時,有時需要將字符串編碼為特定字符集。編碼是一種將數(shù)據(jù)從一種格式轉(zhuǎn)換為另一種格式的方法。字符串對象使用 UTF-16 編碼。UTF-16 的問題在于它不能被修改。只有一種方法可以用來獲得不同的編碼,即 byte[] 數(shù)組。如果我們得到意外的數(shù)據(jù),編碼的方式是不合適的。在本節(jié)中,我們將學(xué)習(xí)如何在Java中對字符串進(jìn)行編碼。
在繼續(xù)本節(jié)之前,我們必須了解字符編碼。讓我們快速瀏覽一下。讓我們了解為什么我們需要對字符串進(jìn)行編碼。
字符編碼是一種將文本數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)的技術(shù)。我們可以為特定字符分配唯一的數(shù)值,并將這些數(shù)字轉(zhuǎn)換為二進(jìn)制語言。這些二進(jìn)制數(shù)稍后可以根據(jù)它們的值轉(zhuǎn)換回原始字符。
問題
假設(shè)我們有德語字符串Tschüss,需要對其進(jìn)行編碼。考慮以下代碼片段:
字符串 str = "Tschüss" ; 字節(jié)[] bytesOfString = str.getBytes(); String encoded_String = new String(bytesOfString, StandardCharsets.US_ASCII); assertNotEquals(encoded_String, str);
如果我們使用 US_ASCII 對字符串進(jìn)行編碼,它會給出Tsch?ss,因?yàn)?US_ASCII 編碼不理解非 ASCII 字符 ( ü )。當(dāng)我們將 ASCII 編碼的字符串轉(zhuǎn)換為 UTF-8 時,我們得到相同的字符串。
字符串 str = "再見" ; 字節(jié)[] bytesOfString = str.getBytes(); String asciiEncondedEnglishString = new String(bytesOfString, StandardCharsets.US_ASCII); assertEquals(encoded_String, str);
如果 byte[] 數(shù)組包含非 Unicode 文本,我們可以使用String構(gòu)造函數(shù)將文本轉(zhuǎn)換為 Unicode。相反,我們也可以使用String.getBytes()方法將 String 對象轉(zhuǎn)換為非 Unicode 字符的 byte[] 數(shù)組。讓我們使用getBytes()方法對字符串進(jìn)行編碼。
使用 String.getBytes() 方法
Java String類提供了getBytes() 方法,用于將字符串編碼為 UTF-8。該方法將字符串轉(zhuǎn)換為字節(jié)序列并將結(jié)果存儲到數(shù)組中。
句法:
公共字節(jié)[] getBytes(String charsetName) 拋出 UnsupportedEncodingException
它將 charsetName 解析為參數(shù)并返回字節(jié)數(shù)組。如果不支持命名字符集,它會拋出UnsupportedEncodingException 。
讓我們創(chuàng)建一個將字符串轉(zhuǎn)換為 UTF-8 編碼的 Java 程序。
StringEncodingExample.java
公共類 StringEncodingExample { 公共靜態(tài)void main(String args[]) 拋出 異常 { //要編碼的字符串 字符串 str = "谷歌云" ; //調(diào)用getBytes()方法并將一個字節(jié)數(shù)組存入array[] 字節(jié) 數(shù)組[] = str.getBytes( "UTF8" ); System.out.println( "編碼字符串:" ); //增強(qiáng)的循環(huán)遍歷數(shù)組 對于 (字節(jié) x:數(shù)組) { //打印字節(jié)序列 System.out.print(x+ " " ); } } }
輸出:
編碼字符串: 71 111 111 103 108 101 32 67 108 111 117 100
使用 StandardCharsets 類
我們還可以使用 StandardCharset 類對字符串進(jìn)行編碼。對字符串進(jìn)行編碼有兩個步驟。首先,將字符串解碼為字節(jié),然后將其編碼為 UTF-8。例如,考慮以下代碼:
字符串 str = "Tschüss" ; ByteBuffer 緩沖區(qū) = StandardCharsets.UTF_8.encode(str); String encoded_String = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(str, encoded_String);
知識點(diǎn)擴(kuò)展:
為什么要編碼
不知道大家有沒有想過一個問題,那就是為什么要編碼?我們能不能不編碼?要回答這個問題必須要回到計(jì)算機(jī)是如何表示我們?nèi)祟惸軌蚶斫獾姆柕?,這些符號也就是我們?nèi)祟愂褂玫恼Z言。由于人類的語言有太多,因而表示這些語言的符號太多,無法用計(jì)算機(jī)中一個基本的存儲單元—— byte 來表示,因而必須要經(jīng)過拆分或一些翻譯工作,才能讓計(jì)算機(jī)能理解。我們可以把計(jì)算機(jī)能夠理解的語言假定為英語,其它語言要能夠在計(jì)算機(jī)中使用必須經(jīng)過一次翻譯,把它翻譯成英語。這個翻譯的過程就是編碼。所以可以想象只要不是說英語的國家要能夠使用計(jì)算機(jī)就必須要經(jīng)過編碼。這看起來有些霸道,但是這就是現(xiàn)狀,這也和我們國家現(xiàn)在在大力推廣漢語一樣,希望其它國家都會說漢語,以后其它的語言都翻譯成漢語,我們可以把計(jì)算機(jī)中存儲信息的最小單位改成漢字,這樣我們就不存在編碼問題了。
所以總的來說,編碼的原因可以總結(jié)為:
- 計(jì)算機(jī)中存儲信息的最小單元是一個字節(jié)即 8 個 bit,所以能表示的字符范圍是 0~255 個
- 人類要表示的符號太多,無法用一個字節(jié)來完全表示,要解決這個矛盾必須需要一個新的數(shù)據(jù)結(jié)構(gòu) char,從 char 到 byte 必須編碼
到此這篇關(guān)于Java字符串編碼知識點(diǎn)詳解介紹的文章就介紹到這了,更多相關(guān)Java字符串編碼的介紹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中靜態(tài)變量和實(shí)例變量的區(qū)別詳細(xì)介紹
本篇文章介紹了,java中靜態(tài)變量和實(shí)例變量的區(qū)別。需要的朋友參考下2013-05-05Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度
這篇文章主要介紹了Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度,Spring中使用Quartz 有兩種方式,感興趣的小伙伴們可以參考一下。2017-02-02Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用JDBC獲取相關(guān)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03深入理解Java中Filter的作用種類及應(yīng)用場景
Filter(過濾器)是Java Web中的一種重要組件,可以對請求和響應(yīng)進(jìn)行攔截處理,對數(shù)據(jù)進(jìn)行過濾和處理。Filter可以實(shí)現(xiàn)許多功能,如:鑒權(quán)、日志記錄、字符編碼轉(zhuǎn)換、數(shù)據(jù)壓縮、請求重定向等等2023-04-04啟用Spring事務(wù)管理@EnableTransactionManagement示例解析
這篇文章主要為大家介紹了啟用Spring事務(wù)管理@EnableTransactionManagement示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java Kafka 消費(fèi)積壓監(jiān)控的示例代碼
這篇文章主要介紹了Java Kafka 消費(fèi)積壓監(jiān)控,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07java中重寫equals()方法的同時要重寫hashcode()方法(詳解)
下面小編就為大家?guī)硪黄猨ava中重寫equals()方法的同時要重寫hashcode()方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Java8新特性O(shè)ptional類處理空值判斷回避空指針異常應(yīng)用
這篇文章主要介紹了Java8新特性O(shè)ptional類處理空值判斷回避空指針異常應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04