详解JAVA中转义字符

本文主要介绍JAVA中转义字符,分享给大家。具体如下:

1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377'

\0:空字符

2.Unicode转义字符:\u + 四个十六进制数字;0~65535

\u0000:空字符

3.特殊字符:就3个

\":双引号 
\':单引号 
\\:反斜线

4.控制字符:5个

\' 单引号字符

\\ 反斜杠字符

\r 回车

\n 换行

\f 走纸换页

\t 横向跳格

\b 退格

点的转义:. ==> u002E

美元符号的转义:$ ==> u0024

乘方符号的转义:^ ==> u005E

左大括号的转义:{ ==> u007B

左方括号的转义:[ ==> u005B

左圆括号的转义:( ==> u0028

竖线的转义:| ==> u007C

右圆括号的转义:) ==> u0029

星号的转义:* ==> u002A

加号的转义:+ ==> u002B

问号的转义:? ==> u003F

反斜杠的转义: ==> u005C

下面的程序使用了两个Unicode的转义字符,它们是用其十六进制代码来表示Unicode字符。那么,这个程序会打印什么呢?

public class EscapeRout{
  public static void main(String[] args){
    // \u0022 是双引号的Unicode转义字符
    System.out.println("a\u0022.length()
+\u0022b".length());
  }
} 

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(错误,应该是14,不知道是怎么会出来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转义字符对照表

点的转义:. ==> u002E

美元符号的转义:$ ==> u0024

乘方符号的转义:^ ==> u005E

左大括号的转义:{ ==> u007B

左方括号的转义:[ ==> u005B

左圆括号的转义:( ==> u0028

竖线的转义:| ==> u007C

右圆括号的转义:) ==> u0029

星号的转义:* ==> u002A

加号的转义:+ ==> u002B

问号的转义:? ==> u003F

反斜杠的转义: ==> u005C

String str2="a$b$c";
String strs[]=str2.split("$");
for(String str:strs){
   System.out.println(str);
} 

代码如下:

String str2="a$b$c";   String strs[]=str2.split("$");   for(String str:strs){    System.out.println(str);   }

并不会打出 a , b ,c需要转义才可如:

String str2="a$b$c";
String strs[]=str2.split("\\u0024");
for(String str:strs){
   System.out.println(str);
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

    在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对在字符串字面常量中的U

  • java清除html转义字符

    复制代码 代码如下: import java.util.HashMap;import java.util.Map; import org.apache.commons.lang3.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * 静态文件处理的一些便捷服务 * @author Kettas * 4:27:25 PM */public class

  • java中的转义字符介绍

    java中的转义字符有四种: JAVA中转义字符: 1.八进制转义序列: + 1到3位5数字:范围'00'~'377':空字符 2.Unicode转义字符:u + 四个十六进制数字:0~65535u0000:空字符 3.特殊字符:就3个":双引号':单引号\:反斜线 4.控制字符:5个 r 回车n 换行f 走纸换页t 横向跳格b 退格 使用这些转义字符的规则:普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,转义字符序列是在程序被解析为各种符

  • 详解JAVA中转义字符

    本文主要介绍JAVA中转义字符,分享给大家.具体如下: 1.八进制转义序列:\ + 1到3位5数字:范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个十六进制数字:0~65535 \u0000:空字符 3.特殊字符:就3个 \":双引号  \':单引号  \\:反斜线 4.控制字符:5个 \' 单引号字符 \\ 反斜杠字符 \r 回车 \n 换行 \f 走纸换页 \t 横向跳格 \b 退格 点的转义:. ==> u002E 美元符号的转义:$ ==&g

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

  • 详解Java中@Override的作用

    详解Java中@Override的作用 @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法. 举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性. @Overr

  • 详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口的LayerInitTask类,ThreadException类,线程安全的Vector 3.思路: 向LayerInitTask中传入Vector,记录异常情况,外部遍历,判断,抛出异常. 4.代码: package step5.exception; import java.util.Vector

  • 详解java 中Spring jsonp 跨域请求的实例

    详解java 中Spring jsonp 跨域请求的实例 jsonp介绍 JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSO

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • 详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 详解Java中HashSet和TreeSet的区别

    详解Java中HashSet和TreeSet的区别 1. HashSet HashSet有以下特点: 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置. 简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个

  • 详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. getClass()是java中Object类的一个方法,其原型为: public final Class<?> getClass() 返回值为 当前运行时类的Class对象. 所以写了一段代码来说明: getClass()不受this和super影响,而是有当前的运行类决定的. 代码如下: 父类

  • 详解Java中Checked Exception与Runtime Exception 的区别

    详解Java中Checked Exception与Runtime Exception 的区别 Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked

随机推荐