最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的字符編碼問題處理心得總結(jié)

 更新時(shí)間:2016年06月26日 15:18:02   作者:阿諾  
Java中的String類默認(rèn)是Unicode編碼,大家平常所說的UTF-8就是使用最廣的一種unicode的實(shí)現(xiàn)方式,以下我們還是來看一下Java中的字符編碼問題處理心得總結(jié):

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

2. String類的getBytes函數(shù) byte[] getBytes() 同樣有如下兩個(gè)重載:
(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)同樣設(shè)計(jì)到這個(gè)問題,為此PrintStream的構(gòu)造函數(shù)中除了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構(gòu)造時(shí)沒有方法指定編碼,但其提供了一個(gè)writeUTF(String str)

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

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

, 我們看到后面漢字每個(gè)用了3個(gè)字節(jié),這個(gè)可以參考Utf-8的相關(guān)知識(shí)。
但如果你頁(yè)面指定的是GBK,那傳過來的就不一樣了:

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

所以servlet端,當(dāng)使用request.getParameter的時(shí)候內(nèi)部應(yīng)該是調(diào)用
String s = new String(bytes, response.getEncoding())的,如果你response沒有設(shè)置編碼,那么就采用默認(rèn)的編碼null會(huì)轉(zhuǎn)為java 平臺(tái)的GBK,那中文就變成亂碼了。
所以為了避免亂碼,jsp站點(diǎn)一般設(shè)一個(gè)過濾器,所有的頁(yè)面、servet都設(shè)置統(tǒng)一的編碼。response.setEncoding, request.setEncoding.

Java的String內(nèi)部是一個(gè)char[], char是一個(gè)用16位存儲(chǔ)的utf-16編碼的單元。為此,當(dāng)要把字符、字符串轉(zhuǎn)為字節(jié)輸出到文件、網(wǎng)絡(luò),或者從文件、網(wǎng)絡(luò)讀到的字節(jié)流還原為有實(shí)際意義的字符,都要明白其編碼是什么。

2016626151159929.jpg (690×492)

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

舉例如下:   

 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();

相關(guān)文章

  • Springboot整合hutool驗(yàn)證碼的實(shí)例代碼

    Springboot整合hutool驗(yàn)證碼的實(shí)例代碼

    在 Spring Boot 中,你可以將 Hutool 生成驗(yàn)證碼的功能集成到 RESTful API 接口中,這篇文章主要介紹了Springboot整合hutool驗(yàn)證碼,需要的朋友可以參考下
    2024-08-08
  • spring?和?idea?建議不要使用?@Autowired注解的原因解析

    spring?和?idea?建議不要使用?@Autowired注解的原因解析

    @Autowired?是Spring框架的注解,而@Resource是JavaEE的注解,這篇文章主要介紹了spring和idea建議不要使用@Autowired注解的相關(guān)知識(shí),需要的朋友可以參考下
    2023-11-11
  • Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動(dòng)scheduleUpdate定時(shí)任務(wù)的流程分析

    Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動(dòng)scheduleUpdate定時(shí)任務(wù)的流程分析

    這篇文章主要介紹了Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動(dòng)scheduleUpdate定時(shí)任務(wù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法,方法通過實(shí)例代碼給大家介紹的非常詳細(xì),選擇使用哪種格式通常取決于項(xiàng)目的需求和上下文,所以格式轉(zhuǎn)換就成了我們必備的技能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2023-10-10
  • SpringBoot2.3.0配置JPA的實(shí)現(xiàn)示例

    SpringBoot2.3.0配置JPA的實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot2.3.0配置JPA的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringBoot整合MongoDB全過程

    SpringBoot整合MongoDB全過程

    這篇文章主要介紹了SpringBoot整合MongoDB全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java 中RSA的方式實(shí)現(xiàn)非對(duì)稱加密的實(shí)例

    java 中RSA的方式實(shí)現(xiàn)非對(duì)稱加密的實(shí)例

    這篇文章主要介紹了java 中RSA的方式實(shí)現(xiàn)非對(duì)稱加密的實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家理解這部分知識(shí),需要的朋友可以參考下
    2017-08-08
  • java??常見位邏輯運(yùn)算符梳理

    java??常見位邏輯運(yùn)算符梳理

    這篇文章主要介紹了java常見位邏輯運(yùn)算符梳理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參一下下面文章詳細(xì)內(nèi)容
    2022-08-08
  • httpclient模擬post請(qǐng)求json封裝表單數(shù)據(jù)的實(shí)現(xiàn)方法

    httpclient模擬post請(qǐng)求json封裝表單數(shù)據(jù)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猦ttpclient模擬post請(qǐng)求json封裝表單數(shù)據(jù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • 淺談Java并發(fā)編程中的線程

    淺談Java并發(fā)編程中的線程

    這篇文章主要介紹了淺談Java并發(fā)編程中的線程,操作系統(tǒng)運(yùn)行一個(gè)程序,就會(huì)創(chuàng)建一個(gè)進(jìn)程,在一個(gè)進(jìn)程里可以創(chuàng)建多個(gè)線程,因此線程也叫做輕量級(jí)進(jìn)程,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

卢龙县| 金阳县| 河西区| 定边县| 赣州市| 通城县| 视频| 墨脱县| 永胜县| 沙河市| 汾西县| 宁城县| 吐鲁番市| 鹤壁市| 札达县| 融水| 海门市| 佳木斯市| 普陀区| 富民县| 华阴市| 阳新县| 卢湾区| 上饶县| 海宁市| 稷山县| 汤阴县| 滕州市| 城步| 通许县| 鸡东县| 宕昌县| 清水河县| 浏阳市| 安仁县| 吴忠市| 平泉县| 郁南县| 铜山县| 柞水县| 新民市|