java中关于转义字符的一个bug

在java中,你可以定义

char c =  'u4f60';

char m =  'u0045';

char e =  'u554a';

这样的字面量,例如:

System.out.println("u535au5ba2u56ed");

这样的代码不管在什么编码环境下都不会出现中文乱码的问题

但是你不能定义这样的字面量:

char c = 'u000a'; 

char m = 'u0027'; 

这是因为u000a和u0027是特殊转义字符,Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。程序会直接按照原字符转换为它们所表示的字符[JLS 3.2]。

u000a是一个LineFeed,即换行,这样程序会编译成

char c = '

';

自然是编译错误了

另一个例子是:

System.out.println("au0022.length()+u0022b".length());   

对该程序的一种很肤浅的分析会认为它应该打印出26,稍微深入一点的分析会认为该程序应该打印16,如果你实际运行一遍,发现结果既不是26也不是16,而是2.

因为,u0022是双引号的转义字,程序最终会编译为

String str = "a".length()+"b";

System.out.println(str.length());  

基于此案例,我写了一个例子,大家可以运行尝试一下结果

String str = "u0061u0022u002bu0028u006eu0065u0077u0020u006au0061u0076u0061u002eu0075u0074u0069u006cu002eu0063u006fu006eu0063u0075u0072u0072u0065u006eu0074u002eu0043u0061u006cu006cu0061u0062u006cu0065<u0056u006fu0069u0064>u0028u0029u007bu0070u0075u0062u006cu0069u0063u0020u0056u006fu0069u0064u0020u0063u0061u006cu006cu0028u0029u007bu0074u0068u0072u006fu0077u0020u006eu0065u0077u0020u0052u0075u006eu0074u0069u006du0065u0045u0078u0063u0065u0070u0074u0069u006fu006eu0028u0022u0073u0075u0070u0072u0069u0073u0065u0020u006du0061u0074u0068u0065u0072u0020u0066u0075u0063u006bu0065u0072u0021u0022u0029u003bu007du007du0029u002eu0063u0061u006cu006cu0028u0029u002bu0022";
System.out.println(str);
原文地址:https://www.cnblogs.com/xcr1234/p/6408156.html