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)表示的字节数组。