Java中的字符编码(char、String)

195 阅读1分钟
public class HelloWorld {
    public static void main(String []args) {
	 char c='𤭢';
         System.out.println(c);
    }
}

上述代码的运行结果如下:

Main.java:3: error: unclosed character literal
	  char c='𤭢';
	         ^
Main.java:3: error: illegal character: '\udf62'
	  char c='𤭢';
	           ^
Main.java:3: error: unclosed character literal
	  char c='𤭢';
	            ^
3 errors

出错信息提示'\udf62'是一个非法字符。我们知道java的内部编码(即实现char、String所采用的编码,外部编码可理解为与外界交互所采用的编码,如输入输出、序列化、编辑源代码等操作所采用的编码)是unicode(utf-16),'𤭢'的utf-16编码是D852 DF62。

'df62'只是'𤭢'的utf-16编码的一个code unit(两个字节长),java的基本数据类型之一char的长度始终是两个字节长,而utf-16是可变长编码,它的code unit是两个字节长,最多需要两个code unit表示一个字符。也就是说char只是utf-16的code unit,char并不一定是一个合法字符。'𤭢'的utf-16编码是两个code unit,用char来表示即为抹去超出部分后的‘df62’。'\udf62'并不是一个utf-16合法字符。

public class HelloWorld {
    public static void main(String []args) {
        char c='\uDF62';
        System.out.println(c);
    }
}

这段代码的运行结果是

?

因为c并不是一个合法字符,无法打印。

public class HelloWorld {
    public static void main(String []args) {
	   String s="𤭢";
	   System.out.println(s.length());
	   System.out.println(s.charAt(0));
    }
}

这段代码的运行结果如下:

2
?

String是CharSequence,是code unit的序列。String的length()统计的是char(code unit)的长度,charAt()获取指定位置的char(code unit),'𤭢'的任意一个code unit都不能表示一个合法字符。另外,String的getBytes方法会返回字符串以外部编码方式(如utf-8)表示的字节数组。