Java中的字符編碼成績處置心得總結。本站提示廣大學習愛好者:(Java中的字符編碼成績處置心得總結)文章只能為提供參考,不一定能成為您想要的結果。以下是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,那末傳過去的就是以下:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, 我們看到前面漢字每一個用了3個字節,這個可以參考Utf-8的相干常識。
但假如你頁面指定的是GBK,那傳過去的就紛歧樣了:
[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編碼的單位。為此,當要把字符、字符串轉為字節輸入到文件、收集,或許從文件、收集讀到的字撙節復原為有現實意義的字符,都要明確其編碼是甚麼。
幾點心得
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 是解碼,即把一個字節數組按你指定的字符集編碼格局停止解碼後輸入成字符串。
舉例以下:
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();