不一样的UniCode
什么是UniCode
UniCode实际上是一种编码标准,又称万国码,单一码,是计算机科学领域的行业标准,Unicode它是为了解决传统字符编码方案的局限性而产生的。它为每种语言中的每个字符设置了统一和唯一的二进制编码,以满足跨语言和跨平台文本转换和处理的要求。
当我们开发跨平台时,我们可以使用它UniCode统一解决编码问题,UniCode仅限于解决编码问题吗?当然不是,UniCode花里胡哨也可以玩。
不一样的UniCode
看下面的案例,能输出什么值?
publicclassTestUniCode{ publicstaticvoidmain(String[]args){ inta=1; //\u000d\u0061\u002b\u002b\u003b System.out.println(a); } }
这不是很简单吗?JAVA注释内容不会执行,所以必须打印出来a=1啊,这不可能有问题,但结果真的是这样吗?
显然,注释中的代码生效了。你怀疑生活了吗?JAVA代码可以用双斜杠注释。为什么双斜杠不起作用?
这就是UniCode的魅力了,编译过程中会将JAVA代码中的UniCode编码翻译成相应的字符。下面验证一波
publicclassTestUniCode1{ publicstaticvoidmain(String[]args){ System.out.println("5 10=\u0022 (5 10) \u0022"); } }
根据句子,这里将被解释为字符串,即原始输出,但结果是
为什么?把上面的Java编译代码,检查编译后class文件
//编译后的class文件 publicclassTestUniCode1{ publicTestUniCode1(){ } publicstaticvoidmain(String[]args){ System.out.println("5 10=15"); } }
JAVA将代码中的UniCode翻译成相应的字符串,并将其翻译成相应的字符串\u0022翻译为双引号半边 ",相当于如下JAVA代码
System.out.println("5 10=" (5 10) "");
除了我们\u除了0022,还有许多特殊的字符,如下所示
\u000a | 换行符 \n | \u0022 | 双引号半边 " |
\u000d | 回车符 \r | \u002b | 加号 |
\u007d | 右半部分的大括号 } | \u003b | 分号 ; |
\u007b | 左半部分的大括号 { | \u0061 – \u007a | 字符 a-z |
\u0041 – \u005a | 字符 A-Z | ||
因此,这也可以解释上述第一个问题,为什么输出a=2呢?
首先,我们可以根据对照表知道\u000d为回车符\r,也就是说,如果车回到双斜杠后面,后面的车UniCode是什么?这个可以借助一些网络UniCode可参考在线翻译工具https://c.runoob.com/front-end/3602/
我们可以清楚地看到后面的代码a ;所以一切都很清楚,我们可以a=2代码等价翻译如下所示
publicstaticvoidmain(String[]args){ inta=1; // a ; System.out.println("==结果打印==" a); }
其它有趣的案例
除上述案例外,还有几个供您参考
案例一
publicstaticvoidmain(String[]args){ if(false==true){ //\u000a\u007d\u007b //换行符右半部分的大括号}左半部分的大括号{ System.out.println("false为真了!!!!"); } } ================================== //输出结果:false为真 //代码型如 System.out.println("false为真了!!!");
案例二
字符混淆
publicstaticvoidmain(String[]args){ //\u0022双引号半边" System.out.println("a\u0022.length() \u0022b".length()); } ================================== //nbsp;输出结果:2
// 代码型如:System.out.println("a".length() + "b".length());
总结
UniCode在开发中可以统一编码,但我们操作的时候一定需要注意特殊字符的转换,一旦不小心在注释中加了特殊UniCode字符,就有可能导致业务错乱,这样就相当于在代码里面下毒了,相当于给自己埋坑。