一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中的字符編碼問題處理心得總結

Java中的字符編碼問題處理心得總結

2020-05-21 11:35阿諾 JAVA教程

Java中的String類默認是Unicode編碼,大家平常所說的UTF-8就是使用最廣的一種unicode的實現方式,以下我們還是來看一下Java中的字符編碼問題處理心得總結:

當面對一串字節流的時候,如果不指定它的編碼,其實際意義是無法知道的。
這句話應該也是我們面對“字符轉字節,字節轉字符”問題時候時刻記在腦子里的。否則亂碼問題可能就接踵而至。
其實亂碼問題的本質就是Encoding和Decoding用的不是一個編碼,明白了這個道理就很好解決亂碼問題了。
Java中常見的時候有如下:
1. String類使用byte[]的構造函數 String(byte[] bytes),String類同時提供了兩個重載
(1)String(byte[] bytes, Charset charset) 
(2)String(byte[] bytes, String charsetName) 就是用來指定編碼的。

2. String類的getBytes函數 byte[] getBytes() 同樣有如下兩個重載:
(1)byte[] getBytes(Charset charset) 
(2) byte[] getBytes(String charsetName)
所有不需指定編碼的都是使用the platform's default charset, 可使用System.getProperty("file.encoding"),Charset.defaultCharset()獲的。
3. PrintStream的 print(String s)同樣設計到這個問題,為此PrintStream的構造函數中除了PrintStream(File file) 還有PrintStream(File file, String csn)
否則the string's characters are converted into bytes according to the platform's default character encoding,
 DataOutputStream構造時沒有方法指定編碼,但其提供了一個writeUTF(String str)

舉開頭的例子說明指定編碼的必要:
如果一個網頁指定編碼為utf-8, <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />, 頁面上有一個form,提交到一個servlet
那么用戶輸入的字符傳過來的字節流就是按指定編碼encoding的,例如你輸入了"Hello你好",如果是utf-8,那么傳過來的就是如下:     

?
1
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]

, 我們看到后面漢字每個用了3個字節,這個可以參考Utf-8的相關知識。
但如果你頁面指定的是GBK,那傳過來的就不一樣了:

?
1
[104, 101, 108, 108, 111, -60, -29, -70, -61]

所以servlet端,當使用request.getParameter的時候內部應該是調用
String s = new String(bytes, response.getEncoding())的,如果你response沒有設置編碼,那么就采用默認的編碼null會轉為java 平臺的GBK,那中文就變成亂碼了。
所以為了避免亂碼,jsp站點一般設一個過濾器,所有的頁面、servet都設置統一的編碼。response.setEncoding, request.setEncoding.

Java的String內部是一個char[], char是一個用16位存儲的utf-16編碼的單元。為此,當要把字符、字符串轉為字節輸出到文件、網絡,或者從文件、網絡讀到的字節流還原為有實際意義的字符,都要明白其編碼是什么。

Java中的字符編碼問題處理心得總結

幾點心得
1.String類始終是以Unicode編碼形式存儲.
2.注意String.getBytes()的使用:
   如果不帶字符集參數,就會依賴于JVM的字符集編碼,LINUX上一般為UNICODE,WINDOWS下一般為GBK.(要想改變JVM缺省字符集編碼,啟動JVM時用選項-Dfile.encodeing=UTF-8.
  為了安全起見,建議始終帶參數調用,例如:String s ; s.getBytes("UTF-8")。
3.Charset類非常好用,
(1)Charset.encode 是編碼,即把String按你指定的字符集編碼格式進行編碼后輸出字節數組。
(2)Charset.decode 是解碼,即把一個字節數組按你指定的字符集編碼格式進行解碼后輸出成字符串。

舉例如下:   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String s = Charset.defaultCharset().displayName();
 String s1 = "我喜歡你,My Love";
 
 ByteBuffer bb1 = ByteBuffer.wrap(s1.getBytes("UTF-8"));
 
 for(byte bt:bb1.array()){
   System.out.printf("%x",bt);
 }
 //char[]用法
 char[] chArray={'I','L','o','v','e','你'};
 
 //CharBuffer用法
 CharBuffer cb = CharBuffer.wrap(chArray);
 //重新定位指針
 cb.flip();
 
 String s2= new String(chArray);
 
 //ByteBuffer用法
 ByteBuffer bb2 = Charset.forName("utf-8").encode(cb);
 
 // 利用Charset編碼為指定字符集
 
 ByteBuffer bb3 = Charset.forName("utf-8").encode(s1);
 
 byte [] b  = bb3.array() ;
 
 // 利用Charset按指定字符集解碼為字符串
 ByteBuffer bb4= ByteBuffer.wrap(b);
 
 String s2 = Charset.forName("utf-8").decode(bb4).toString();

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久伊人中文字幕有码 | 好吊妞视频998www | 国产小青蛙 | 暖暖的免费观看高清视频韩国 | 国产91第一页 | freesex性欧美炮机喷潮 | 国产精品区一区二区免费 | 国产高清视频网站 | 日本三级成人中文字幕乱码 | 国产成人精品777 | 欧美色精品天天在线观看视频 | 免费国产好深啊好涨好硬视频 | 91精品手机国产在线观 | 国产男人搡女人免费视频 | 婷婷综合缴情亚洲五月伊 | 99精品国产自产在线观看 | 娇妻被健身教练挺进小说阅读 | 歪歪视频在线播放无遮挡 | 亚洲 欧美 中文 日韩 另类 | 99精品在免费线视频 | 91麻豆精品国产自产在线 | 极品蜜桃臀美女啪啪 | 波多野结衣无码 | 国产精品亚洲一区二区 | 国产夜趣福利第一视频 | 亚洲视频在线免费观看 | 欧美在线一级片 | 午夜国产小视频 | 好奇害死猫在线观看 | 吉泽明步高清无码中文 | 隔壁老王国产精品福利 | 美女毛片视频 | 亚洲男人天堂久久 | 非洲黑人xxxxxbbbbb | 国产精品亚洲精品观看不卡 | 99精品在线免费观看 | 91久久偷偷做嫩草影院免费看 | 青草国产| 亚洲国产欧美另类 | 波多野结衣中文丝袜字幕 | 久久成人永久免费播放 |