首页 > 开发 > Java > 正文

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

2024-07-13 10:04:07
字体:
来源:转载
供稿:网友

在java中,你可以定义

char c = '/u4f60';char m = '/u0045';char e = '/u554a';

这样的字面量,例如:

System.out.println("/u535a/u5ba2/u56ed");

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

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

char c = '/u000a';char m = '/u0027';

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

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

char c = '';

自然是编译错误了

另一个例子是:

System.out.println("a/u0022.length()+/u0022b".length());   

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

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

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

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

String str = "/u0061/u0022/u002b/u0028/u006e/u0065/u0077/u0020/u006a/u0061/u0076/u0061/u002e/u0075/u0074/u0069/u006c/u002e/u0063/u006f/u006e/u0063/u0075/u0072/u0072/u0065/u006e/u0074/u002e/u0043/u0061/u006c/u006c/u0061/u0062/u006c/u0065</u0056/u006f/u0069/u0064>/u0028/u0029/u007b/u0070/u0075/u0062/u006c/u0069/u0063/u0020/u0056/u006f/u0069/u0064/u0020/u0063/u0061/u006c/u006c/u0028/u0029/u007b/u0074/u0068/u0072/u006f/u0077/u0020/u006e/u0065/u0077/u0020/u0052/u0075/u006e/u0074/u0069/u006d/u0065/u0045/u0078/u0063/u0065/u0070/u0074/u0069/u006f/u006e/u0028/u0022/u0073/u0075/u0070/u0072/u0069/u0073/u0065/u0020/u006d/u0061/u0074/u0068/u0065/u0072/u0020/u0066/u0075/u0063/u006b/u0065/u0072/u0021/u0022/u0029/u003b/u007d/u007d/u0029/u002e/u0063/u0061/u006c/u006c/u0028/u0029/u002b/u0022";System.out.println(str);

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持VeVb武林网!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表