string str = "中國"; system.out.println(str.length()); //這些應該都沒有問題,關鍵在下面 system.out.println(str.getbytes().length);//注意這裡是得到的gbk的位元組,乙個漢字gbk編碼是2個位元組
system.out.println(new string(str.getbytes(),"utf-8")); //這裡用得到的gbk的位元組去轉換成utf-8,需要注意的是一般情況下utf-8漢字占有3個位元組,而acsll碼在utf-8中是乙個位元組
//而編碼轉換的規則是對位元組進行掃瞄,如果可以轉換成1個位元組的ascll就優先轉換,可以轉換成2個位元組就優先轉換成兩個位元組的utf-8編碼 //* 0******x (00-7f) ascll // * 110***xx 10****** (c0-df)(80-bf) ascll和漢字之間的一些字元
//* 1110***x 10****** 10****** (e0-ef)(80-bf)(80-bf) 漢字
//* 11110*** 10****** 10****** 10****** (f0-f7)(80-bf)(80-bf)(80-bf)
//* 111110xx 10****** 10****** 10****** 10****** (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
//* 1111110x 10****** 10****** 10****** 10****** 10****** (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
//仔細看上面的utf-8的編碼表 再看通過getbytes(),
最終得到的二進位製碼是11010110 11010000 10111001 11111010(樓主可以自己去輸出以下,注意負數的轉換即可)
//第乙個位元組與第二個一直到最後位元組組合不成utf-8編碼(110開始的只有上面的第二行,但是下乙個位元組不是10******,
因此要對第乙個位元組單獨解碼
//再看第二個與第三個位元組為11010000 10111001 剛好是乙個上面的第二行的範圍內,所以對他們兩個進行乙個utf-8解碼
//最後對11111010 進行解碼
//通過以上分析可以知道得到的utf-8時3個字元,所以長度是3
system.out.println(new string(str.getbytes(),"utf-8").getbytes().length);
string str2 ="abc中國";
system.out.println(str2.length());
system.out.println(str2.getbytes().length);
system.out.println(new string(str2.getbytes(),"utf-8").length());
//01100001 01100010 01100011 11010110 11010000 10111001 11111010
//一樣從左到右去解碼 顯然前三個位元組滿足第乙個範圍分別解碼為abc,後面就與上面的分析一樣了
//順便說一句,如果不想得到亂碼可以用getbytes("utf-8") system.out.println(new string(str2.getbytes(),"utf-8").getbytes().length);
SpringMVC 返回String中文亂碼
spring 返回值為string型別的結果時使用了stringhttpmessageconverter 來轉換部分原始碼如下 public class stringhttpmessageconverter extends abstracthttpmessageconverter可見使用預設的編碼是...
String中文字元轉碼
如何使用string構造方法和string.getbytes 做好中文字元轉碼 1 test 2public void test catch unsupportedencodingexception e 30 為什麼使用iso8859 1編碼再組合之後,無法還原 中 字呢?其實原因很簡單,因為iso...
String拼接問題
問題 package com.edu.string string拼接 author xukai public static void main string args 控制台輸出的內容為 null123 感覺有點沒有理解,還是基礎不夠牢固啊,上網查詢一番,得出的結果 string拼接中間會產生str...