Java中關(guān)于字符串的編碼方式
字符串的編碼方式
UTF-8是Unicode的一種實(shí)現(xiàn)方式,也就是它的字節(jié)結(jié)構(gòu)有特殊要求,所以我們說(shuō)一個(gè)漢字的范圍是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的編碼里去就是由三個(gè)字節(jié)來(lái)組織,所以可以看出unicode是給出一個(gè)字符的范圍,定義了這個(gè)字是碼值是多少,至于具體的實(shí)現(xiàn)方式可以有多種多樣來(lái)實(shí)現(xiàn)。
idea中默認(rèn)的字符串編碼方式為utf-8
System.out.println(System.getProperty("file.encoding"));
更改編碼方式:settings->fileCoding->GlobalEncoding = GBK
輸出結(jié)果:
utf-8和GBK中字符串所占用的字節(jié)數(shù)
public static void print(String s) { for (byte aByte : s.getBytes()) { System.out.println(aByte); } System.out.println("----------------"); }
GBK編碼方式下,鍵盤(pán)在中文狀態(tài)
數(shù)字字母占一個(gè)字節(jié),符號(hào)或者中文占用兩個(gè)字節(jié)
public static void main(String[] args) { String s1 = "2"; print(s1); String s2 = ";"; print(s2); String s3 = "方"; print(s3); String s4 = "23f方"; print(s4); }
gbk編碼方式下,鍵盤(pán)在英文狀態(tài)
字母數(shù)字占,符號(hào)用1個(gè)字節(jié),中文占用兩個(gè)字節(jié)
public static void main(String[] args) { String s1 = "2"; print(s1); String s2 = ";"; print(s2); String s3 = "f"; print(s3); String s4 = "23f方"; print(s4); }
utf-8的方式下
中文,中文符號(hào)占用3個(gè)字節(jié),英文符號(hào)占用1個(gè)字節(jié),字母數(shù)字占用1個(gè)字節(jié)
public static void main(String[] args) { String s1 = "2"; print(s1); String s2 = ";"; print(s2); String s3 = "方"; print(s3); String s4 = "23f方"; print(s4); }
小結(jié):
- utf-8下中文中文符號(hào)占用3字節(jié),英文符號(hào),字母數(shù)字占用1個(gè)字節(jié)
- gbk下中文中文符號(hào)占用2字節(jié),英文符號(hào),字母數(shù)字占用1個(gè)字節(jié)
設(shè)置字符串編碼、轉(zhuǎn)碼
Unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案等。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿(mǎn)足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。1990年開(kāi)始研發(fā),1994年正式公布。
Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。目前的Unicode字符分為17組編排,0x0000 至 0x10FFFF,每組稱(chēng)為平面(Plane),而每平面擁有65536個(gè)碼位,共1114112個(gè)。然而目前只用了少數(shù)平面。UTF-8、UTF-16、UTF-32都是將數(shù)字轉(zhuǎn)換到程序數(shù)據(jù)的編碼方案。
通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱(chēng)ISO/IEC 10646)標(biāo)準(zhǔn)所定義的標(biāo)準(zhǔn)字符集。UCS-2用兩個(gè)字節(jié)編碼,UCS-4用4個(gè)字節(jié)編碼。
UTF-8
UTF-8以字節(jié)為單位對(duì)Unicode進(jìn)行編碼。
UTF-8(8-bit Unicode Transformation Format)是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,又稱(chēng)萬(wàn)國(guó)碼,由Ken Thompson于1992年創(chuàng)建?,F(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC 3629。UTF-8用1到6個(gè)字節(jié)編碼Unicode字符。
用在網(wǎng)頁(yè)上可以統(tǒng)一頁(yè)面顯示中文簡(jiǎn)體繁體及其它語(yǔ)言(如英文,日文,韓文)。
UTF-16
UTF-16編碼以16位無(wú)符號(hào)整數(shù)為單位。
UTF-16是Unicode字符編碼五層次模型的第三層:字符編碼表(Character Encoding Form,也稱(chēng)為 "storage format")的一種實(shí)現(xiàn)方式。即把Unicode字符集的抽象碼位映射為16位長(zhǎng)的整數(shù)(即碼元)的序列,用于數(shù)據(jù)存儲(chǔ)或傳遞。Unicode字符的碼位,需要1個(gè)或者2個(gè)16位長(zhǎng)的碼元來(lái)表示,因此這是一個(gè)變長(zhǎng)表示。
UTF-16是Unicode的其中一個(gè)使用方式。 UTF是 Unicode TransferFormat,即把Unicode轉(zhuǎn)做某種格式的意思。
它定義于ISO/IEC 10646-1的附錄Q,而RFC2781也定義了相似的做法。
在Unicode基本多文種平面定義的字符(無(wú)論是拉丁字母、漢字或其他文字或符號(hào)),一律使用2字節(jié)儲(chǔ)存。而在輔助平面定義的字符,會(huì)以代理對(duì)(surrogate pair)的形式,以?xún)蓚€(gè)2字節(jié)的值來(lái)儲(chǔ)存。UTF-16比起UTF-8,好處在于大部分字符都以固定長(zhǎng)度的字節(jié) (2字節(jié)) 儲(chǔ)存,但UTF-16卻無(wú)法兼容于ASCII編碼。
UTF-32
UTF-32編碼以32位無(wú)符號(hào)整數(shù)為單位。
Unicode的UTF-32編碼就是其對(duì)應(yīng)的32位無(wú)符號(hào)整數(shù)。
UTF-32 (或 UCS-4)是一種將Unicode字符編碼的協(xié)定,對(duì)每一個(gè)Unicode碼位使用恰好32位元。其它的Unicode transformation formats則使用不定長(zhǎng)度編碼。因?yàn)閁TF-32對(duì)每個(gè)字符都使用4字節(jié),就空間而言,是非常沒(méi)有效率的。特別地,非基本多文種平面的字符在大部分文件中通常很罕見(jiàn),以致于它們通常被認(rèn)為不存在占用空間大小的討論,使得UTF-32通常會(huì)是其它編碼的二到四倍。雖然每一個(gè)碼位使用固定長(zhǎng)定的字節(jié)看似方便,它并不如其它Unicode編碼使用得廣泛。j
java中編碼
String gbkStr = "你好哦!"; //源碼文件是GBK格式,或者這個(gè)字符串是從GBK文件中讀取出來(lái)的, 轉(zhuǎn)換為string 變成unicode格式 //利用getBytes將unicode字符串轉(zhuǎn)成UTF-8格式的字節(jié)數(shù)組 byte[] utf8Bytes = gbkStr.getBytes("UTF-8");? //然后用utf-8 對(duì)這個(gè)字節(jié)數(shù)組解碼成新的字符串 String utf8Str = new String(utf8Bytes, "UTF-8");
簡(jiǎn)化后就是:
unicodeToUtf8 (String s) { return new String( s.getBytes("utf-8") , "utf-8"); }
UTF-8 轉(zhuǎn)GBK原理也是一樣
return new String( s.getBytes("GBK") , "GBK");
解決編碼亂碼
java 獲取系統(tǒng)中默認(rèn)的編碼
? //方法一:中文操作系統(tǒng)中打印GBK ?? System.out.println(System.getProperty("file.encoding")); ?? //方法二:中文操作系統(tǒng)中打印GBK ?? System.out.println(Charset.defaultCharset()); ??
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單了解JAVA public class與class區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解JAVA public class與class區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Springboot線(xiàn)程池并發(fā)處理數(shù)據(jù)優(yōu)化方式
這篇文章主要介紹了Springboot線(xiàn)程池并發(fā)處理數(shù)據(jù)優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java中StringBuffer和StringBuilder區(qū)別
這篇文章主要介紹了Java中StringBuffer和StringBuilder區(qū)別,本文只介紹了它們之間的核心區(qū)別,需要的朋友可以參考下2015-06-06Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解
這篇文章主要介紹了Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解,使用org.springframework.beans.BeanUtils.copyProperties方法進(jìn)行對(duì)象之間屬性的賦值,避免通過(guò)get、set方法一個(gè)一個(gè)屬性的賦值,需要的朋友可以參考下2023-12-12Java遞歸遍歷樹(shù)形結(jié)構(gòu)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java遞歸遍歷樹(shù)形結(jié)構(gòu)的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-03-03關(guān)于idea的gitignore文件編寫(xiě)及解決ignore文件不生效問(wèn)題
這篇文章主要介紹了idea的gitignore文件編寫(xiě)及解決ignore文件不生效問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03IntelliJ?IDEA?代碼運(yùn)行時(shí)中文出現(xiàn)亂碼問(wèn)題及解決方法
在我們剛接觸到IDEA時(shí),想美滋滋的敲一個(gè)“hello?world”來(lái)問(wèn)候這個(gè)世界,但難免會(huì)遇到這種問(wèn)題亂碼,這篇文章主要介紹了解決IntelliJ?IDEA?代碼運(yùn)行時(shí)中文出現(xiàn)亂碼問(wèn)題,需要的朋友可以參考下2023-09-09Java實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)功能界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)功能界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11java使用正則表達(dá)式判斷手機(jī)號(hào)的方法示例
這篇文章主要介紹了java使用正則表達(dá)式判斷手機(jī)號(hào)的方法,分析了手機(jī)號(hào)碼段的原理及java使用正則表達(dá)式針對(duì)手機(jī)號(hào)的匹配操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06