為什么寫這個(gè)
在龍山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需開發(fā)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,龍山網(wǎng)站建設(shè)費(fèi)用合理。
至于為什么要寫這個(gè),主要是一句mmp一定要講,繞了一上午,暈死
Java程序中的中文亂碼問題一直是一個(gè)困擾程序員的難題,自己也不例外,早在做項(xiàng)目時(shí)就遇到過很多編碼方式的坑,當(dāng)時(shí)想填來著,但是嫌麻煩。這次終于忍不住了,一定要弄個(gè)明白
String類型的編碼方式
從網(wǎng)上查的資料都說,Java默認(rèn)的字符編碼是Unicode,而String類型的編碼方式是與JVM編碼方式和本機(jī)操作系統(tǒng)默認(rèn)字符集有關(guān)的。于是我做出了測(cè)試
在Java中可以這樣顯示查看本地編碼方式(JVM還是OS呢?)
// Gets the system property indicated by the specified key. System.out.println(System.getProperty(file.encoding));
看注釋上說是獲取系統(tǒng)字符集,但是我對(duì)這個(gè)系統(tǒng)的概念表示存疑,為什么呢,因?yàn)楸娝苤?,我們中?guó)人的電腦大部分默認(rèn)的字符編碼方式就是GBK,在CMD中輸入chcp可以獲得一個(gè)數(shù)值936,這就表示了是GBK的編碼方式。
但是我自己運(yùn)行出這句話的結(jié)果竟然是UTF-8,我是在IDEA中運(yùn)行的,并且已經(jīng)使用IDEA設(shè)置了項(xiàng)目的編碼方式是UTF-8,出現(xiàn)這樣的結(jié)果我只能是猜測(cè)其實(shí)上面這句話是獲取JVM(跟隨項(xiàng)目的編碼方式)的編碼方式
接下來我們來回歸正題,String類型的默認(rèn)編碼方式是什么,有下面這幾句語句:
/* 測(cè)試String類型默認(rèn)的編碼方式 */ // 使用String的有參構(gòu)造方法 String str = new String("hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑"); // 1.以GBK編碼方式獲取str的字節(jié)數(shù)組,再用String有參構(gòu)造函數(shù)構(gòu)造字符串 System.out.println(new String(str.getBytes("GBK"))); // 2.以UTF-8編碼方式獲取str的字節(jié)數(shù)組,再以默認(rèn)編碼構(gòu)造字符串 System.out.println(new String(str.getBytes("UTF-8")));
下面來看一下運(yùn)行結(jié)果:
// 1.
hhhh ty����%shfu�����ʮ��uif�ڷ�NSF��i����ظ���u��Ϊ��ؼu ��δ���δ��� hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑i飛鳥回復(fù)額u發(fā)為呢丶u 房未婚夫未婚夫
// 2.
hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑i飛鳥回復(fù)額u發(fā)為呢丶u 房未婚夫未婚夫
可以很明顯的可以看出,這里String類型默認(rèn)的字符編碼方式就是與我們查看本地系統(tǒng)的編碼方式相同。因此我們得出結(jié)論:String類型的默認(rèn)編碼方式是和本地編碼方式相關(guān)
String.getBytes()方法
我們大多數(shù)情況下是不使用String類型的,而是使用byte數(shù)組來傳輸操作數(shù)據(jù),一般會(huì)使用String.getBytes()方法來將字符串轉(zhuǎn)換成字節(jié)數(shù)組。但是這樣轉(zhuǎn)換的時(shí)候,會(huì)不會(huì)牽涉到編碼問題呢?仔細(xì)查看了String.getBytes()的源碼,分為無參的和有參的兩種:
// 1.無參的getBytes()方法 public byte[] getBytes() { // 再繼續(xù)深入encode()方法可以發(fā)現(xiàn)使用的是系統(tǒng)默認(rèn)的字符編碼 return StringCoding.encode(value, 0, value.length); } // 2.帶參數(shù)的getBytes(String charsetName)方法 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException { if (charsetName == null) throw new NullPointerException(); // 繼續(xù)深入可以發(fā)現(xiàn),會(huì)使用參數(shù)字符集編碼方式來返回字節(jié)數(shù)組,如果參數(shù)字符集不存在,則使用本地系統(tǒng)默認(rèn)的字符編碼 return StringCoding.encode(charsetName, value, 0, value.length); }
綜上,在這里再?gòu)?qiáng)調(diào)一下,因?yàn)樾薷牧隧?xiàng)目的編碼方式,導(dǎo)致了本地系統(tǒng)的編碼方式也變成了UTF-8,所以上述的實(shí)驗(yàn)都是基于IDE修改了工程項(xiàng)目編碼方式的基礎(chǔ)上
ByteBuffer與byte數(shù)組的互相轉(zhuǎn)換
在NIO中,一般都是使用ByteBuffer來當(dāng)作字符緩沖,而有的時(shí)候我們只有byte[]數(shù)組,所以是需要它們之間進(jìn)行相互轉(zhuǎn)換的
// ByteBuffer ----> byte[] byte[] bytes = ByteBuffer.array(); // byte[] ------> ByteBuffer byte[] bytes = new byte[1024]; ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
So
綜上所述,再在這里總結(jié)一下:
小總結(jié)
搞清楚了這些甚是豁然開朗,其實(shí)很多時(shí)候中文的亂碼問題根源就是編碼方式與解碼方式不一致,或者是不同編碼方式之間轉(zhuǎn)換時(shí)造成了bit損失。所以我們還是要注意規(guī)范化編碼與解碼方式,畢竟有的轉(zhuǎn)換操作是不可逆的。
以上所述是小編給大家介紹的Java中String類型與默認(rèn)字符編碼詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!
分享題目:詳解Java中String類型與默認(rèn)字符編碼
鏈接地址:http://jinyejixie.com/article42/gdjohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、定制網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、域名注冊(cè)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)