下面的程序使用了两个Unicode的转义字符,它们是用其十六进制代码来表示Unicode字符。那么,这个程序会打印什么呢?
public class EscapeRout{
public static void main(String[] args){
// \u0022 是双引号的Unicode转义字符
System.out.println("a\u0022.length()
+\u0022b".length());
}
}
对该程序的一种很肤浅的分析会认为它应该打印出26,因为在由两个双引号"a\u0022.length()+\u0022b"标识的字符串之间总共有26个字符。
稍微深入一点的分析会认为该程序应该打印16,因为两个Unicode转义字符每一个在源文件中都需要用6个字符来表示,但是它们只表示字符串中的一个字符。因此这个字符串应该比它的外表看其来要短10个字符。 如果你运行这个程序,就会发现事情远不是这么回事。它打印的既不是26也不是16,而是2。
理解这个谜题的关键是要知道:Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode转义字符转换成为它们所表示的字符[JLS 3.2]。因此,程序中的第一个Unicode转义字符将作为一个单字符字符串字面常量("a")的结束引号,而第二个Unicode转义字符将作为另一个单字符字符串字面常量("b")的开始引号。程序打印的是表达式"a".length()+"b".length(),即2。
如果该程序的作者确实希望得到这种行为,那么下面的语句将要清楚得多:
System.out.println("a".length()+"b".length());
更有可能的情况是该作者希望将两个双引号字符置于字符串字面常量的内部。使用Unicode转义字符你是不能实现这一点的,但是你可以使用转义字符序列来实现[JLS 3.10.6]。表示一个双引号的转义字符序列是一个反斜杠后面紧跟着一个双引号(\”)。如果将最初的程序中的Unicode转义字符用转义字符序列来替换,那么它将打印出所期望的16:
System.out.println("a\".length()+\"b".length());
许多字符都有相应的转义字符序列,包括单引号(\')、换行(\n)、制表符(\t)和反斜线(\\)。你可以在字符字面常量和字符串字面常量中使用转义字符序列。
实际上,你可以通过使用被称为八进制转义字符的特殊类型的转义字符序列,将任何ASCII字符置于一个字符串字面常量或一个字符字面常量中,但是最好是尽可能地使用普通的转义字符序列。
普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,转义字符序列是在程序被解析为各种符号之后被处理的。
ASCII是字符集的最小公共特性集,它只有128个字符,但是Unicode有超过65,000个字符。一个Unicode转义字符可以被用来在只使用ASCII字符的程序中插入一个Unicode字符。一个Unicode转义字符精确地等价于它所表示的字符。
Unicode转义字符被设计为用于在程序员需要插入一个不能用源文件字符集表示的字符的情况。它们主要用于将非ASCII字符置于标识符、字符串字面常量、字符字面常量以及注释中。偶尔地,Unicode转义字符也被用来在看起来颇为相似的数个字符中明确地标识其中的某一个,从而增加程序的清晰度。
总之,在字符串和字符字面常量中要优先选择的是转义字符序列,而不是Unicode转义字符。Unicode转义字符可能会因为它们在编译序列中被处理得过早而引起混乱。不要使用Unicode转义字符来表示ASCII字符。在字符串和字符字面常量中,应该使用转义字符序列;对于除这些字面常量之外的情况,应该直接将ASCII字符插入到源文件中。
分享到:
相关推荐
Java-转义字符参考
08-转义字符
4. 转义字符:在Java中,转义字符是一种特殊语法,它们以反斜杠 `\` 开头,用于表示那些不能直接显示或者有特殊含义的字符。以下是一些常见的转义字符: - `\ddd`:表示一个八进制数所代表的字符,ddd是1到3位的八...
字符串中的转义字符是一个特殊概念,它允许我们在字符串中插入特殊字符或表示无法直接输入的字符。转义字符是通过在字符前加上反斜杠 `\` 来实现的。在Python中,转义字符主要用于以下几种情况: 1. **续行符**:当...
在C#编程语言中,转义字符(Escape Character)是一种特殊字符,用于指示字符串或字符字面量中的特定字符有特殊含义。转义字符以反斜杠(\)开头,它告诉编译器后面的字符应该被特殊处理。转义字符在多种场景下都...
本期主要讲了转义字符的说明,这个转义字符说明虽然比较简单,但是也是要背下来的。因为这个很重要!
在Java字符串中,转义字符尤其常见。例如,如果你想要创建一个包含换行的字符串,可以这样写: ```java String str = "Hello,\nWorld!"; ``` 这将在控制台上打印出两行,第一行是"Hello,",第二行是"World!"。 ...
HTML转义字符是网页开发中不可或缺的一部分,它们用于在HTML文档中表示特殊字符,防止浏览器错误解析或意外的代码执行。这些字符实体通常由一个反斜杠(\)后跟一个或多个数字或字母组成,例如"<"代表小于号(<)...
### 常见转义字符在Java中的应用与解析 #### 概述 在编程语言中,转义字符是一类特殊的字符序列,用于表示那些在文本中无法直接表示或者具有特殊含义的字符。Java作为一种广泛使用的面向对象编程语言,支持多种...
### JAVA转义字符详解 在Java编程语言中,转义字符是一种特殊的形式,用于表示一些预定义的字符或控制字符。这些字符对于处理文本、字符串以及格式化输出等任务至关重要。本文将详细介绍Java中的转义字符,包括它们...
为了解决这个问题,可以使用Java来实现对这些特殊字符的转义处理。 #### 三、代码分析 下面是一段示例代码,用于清除HTML标签,并提供了一些额外的功能: ```java import java.util.HashMap; import java.util.Map...
价值上万的Java精品网课教程\第02天(进制,位运算,语句)
### Java转义字符详解 #### 一、概述 在编程语言中,为了处理特殊字符或控制符,常常会使用到转义序列。Java作为一种广泛使用的编程语言,也提供了一套丰富的转义字符来帮助开发者更好地处理字符串数据。本文将...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
特殊字符是指在Java字符串中具有特殊含义的一些字符,它们可以用特定的转义序列来表示。 - `\"` 表示双引号字符`"`。 - `\'` 表示单引号字符`'`。 - `\\` 表示反斜杠字符`\`。 #### 四、控制字符 控制字符是在...
Mybatis是一个流行的Java持久层框架,它通过XML或注解的方式,将对象与数据库中的表进行映射,实现数据库操作的自动化。在Mybatis框架中,Mapper.xml文件是定义SQL映射的关键组件,它允许开发者编写SQL语句并执行...
在Java编程语言中,转义字符是用于在字符串或字符字面量中表示特殊意义的字符。这些字符在源代码中以反斜线(\)开头,随后跟特定的序列,以便让编译器理解其真正的含义。以下是Java中转义字符的详细解释: 1. **八...
### JavaScript ASP教程第二课——转义字符 #### 引言 在JavaScript ASP教程的第二课中,我们将深入了解“转义字符”的概念及其在ASP中的重要性。转义字符虽然看似简单,但在实际开发中却扮演着至关重要的角色,...