Java里面內置字符串全部是utf-16編碼,詳細的編碼方式看這里
import java.nio.charset.Charset; import java.util.Arrays; import java.util.Map; public class String2Bytes { public static void main(String[] args) { String str = "\u005Bab我"; Map<String, Charset> charsetMap = Charset.availableCharsets(); for(String charsetName : charsetMap.keySet()) { System.out.println(charsetName + ":" + charsetMap.get(charsetName)); } System.out.println(str.charAt(3)); //String的getBytes()方法是得到一個字串的字節數組,這是眾所周知的。 //但特別要注意的是,本方法將返回該操作系統默認的編碼格式的字節數組。 //如果你在使用這個方法時不考慮到這一點,你會發現在一個平台上運行良好的系統,放到另外一台機器后會產生意想不到的問題。 System.out.println(Arrays.toString(str.getBytes())); //附加級別的字符 char[] c = Character.toChars(Integer.parseInt("1D306", 16)); String str1 = new String(c); System.out.println(str1); //附加級別的字符占用了2個代碼單元 System.out.println(c.length); System.out.println(str1.length()); //但是只占用一個代碼點 System.out.println(str1.codePointCount(0, str1.length())); //訪問第一個代碼單元,這種做法是錯誤的 System.out.println(str1.charAt(0)); //查看保存在內存里的方式 /* * 算法 * H = Math.floor((c-0x10000) / 0x400)+0xD800 * L = (c - 0x10000) % 0x400 + 0xDC00 */ System.out.println(Integer.toString((int)str1.charAt(0), 16));//0xD834 System.out.println(Integer.toString((int)str1.charAt(1), 16));//0xDF06 //訪問第一個代碼點,正確的做法 int index = str1.offsetByCodePoints(0, 0); System.out.println(str1.codePointAt(index)); String str2 = str1 + "abc"; //順序訪問一個String正確的方式 int count = str2.codePointCount(0, str2.length()); for(int i=0; i < count; ++i) { int index1 = str2.offsetByCodePoints(0, i); int cp = str2.codePointAt(index1); System.out.print(Character.toChars(cp)); } System.out.println(); } }