你好!在前面的课程中,我们已经熟悉了文本字符串,它由 Java 中的 String 类表示。 Java 转义字符 - 1你可能还记得,字符串是一系列字符。 这些字符可以是任何字母、数字、标点符号等等。创建字符串时,最重要的是整个序列必须用引号括起来:

public class Main {
   public static void main(String[] args) {
       String alex = new String ("My name is Alex. I'm 20!");
   }
}
但是,如果我们需要创建一个本身必须包含引号的字符串,那该怎么办呢?例如,假设我们想告诉大家你最喜欢的书:

public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is "Twilight" by Stephanie Meyer");
   }
}
似乎编译器不高兴了! 你认为问题可能是什么?和引号有什么关系吗? 其实都很简单。编译器以一种非常特殊的方式解释引号,也就是说,它希望字符串包含在引号中。而编译器每次看到 ",就预计引号后面跟第二个引号,两者之间的内容是编译器要创建的字符串的文本。在我们的例子中,围绕 "暮光之城" 字词周围的引号在其他引号内。当编译器到达这段文本时,就根本不知道应该做什么。引号表示必须创建一个字符串。但编译器已经在这么做了! 原因如下:简单地说,编译器对应该执行什么操作不知所措。 " 另一个引号?这是发生错误了吗?我已经在创建字符串了!或者我应该再创造一个?啊!...:/" 我们需要让编译器知道什么时候引号是命令(“创建一个字符串!”),什么时候它只是一个字符(“显示 "暮光之城" 字词连同引号!”)。 为此,Java 使用字符转义。 这是通过一个特殊的符号 \ 来实现的:这个符号通常被称为“反斜杠”。在 Java 中,一个反斜杠与一个要“转义”的字符组合在一起称为控制序列。 例如,\" 是在屏幕上显示引号的控制序列。 在代码中遇到这个构造时,编译器会理解这只是一个应该显示在屏幕上的引号。 让我们试着对这本书改变代码:

public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is \"Twilight\" by Stephanie Meyer");
       System.out.println(myFavoriteBook);
   }
}
我们使用 \ 来转义我们的两个“内部”引号。让我们尝试运行 main() 方法... 控制台输出:
My favorite book is "Twilight" by Stephanie Meyer
太棒了!代码完全按照我们的需要运行! 引号绝不是我们可能需要转义的唯一字符。假设我们想告诉别人我们的工作:

public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("My work files are in D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
另一个错误!你能猜到原因吗? 编译器又一次不明白该怎么做。毕竟,编译器认定 \ 就是个控制序列,而不是别的什么东西!它希望反斜杠后面跟一个必须以特殊方式解释的特定字符(比如引号)。 但是,在这种情况下,\ 后跟普通字母。所以编译器又糊涂了。我们应该做什么呢?和以前完全一样:只将另一个 \ 添加到 \ 即可!

public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("My work files are in D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
现在看看得到了什么: 控制台输出:
My work files are in D:\Work Projects\java
超赞!编译器立即确定 \ 是应该与其余字符一起显示的普通字符。 Java 有相当多的控制序列。以下是完整列表:
  • \t — 制表符。
  • \b — 退格(在文本中后退一步或删除一个字符)。
  • \n — 新行。
  • \r — 回车。()
  • \f — 换页。
  • \' — 单引号。
  • \" — 双引号。
  • \\ — 反斜杠。
因此,如果编译器在文本中遇到 \n,它知道这不仅仅是显示在控制台上的一个符号和一个字母,而是一个特殊的命令“移动到新的一行!” 例如,如果我们想要显示一首诗的一部分,这可能很有用:

public class Main {
   public static void main(String[] args) {
       String byron = new String ("She walks in beauty, like the night, \nOf cloudless climes and starry skies\nAnd all that's best of dark and bright\nMeet in her aspect and her eyes...");
       System.out.println(byron);
   }
}
以下是我们得到的结果: 控制台输出:
She walks in beauty, like the night, 
Of cloudless climes and starry skies 
And all that's best of dark and bright 
Meet in her aspect and her eyes...
这是我们所需要的!编译器识别出了转义序列,并输出了这首诗节选的 4 行。

转义 Unicode 字符

关于转义字符,你需要了解的另一个重要主题是 Unicode。 Unicode 是一种标准的字符编码,包含了世界上几乎所有书面语言的符号。 换句话说,它是一个特殊代码的列表,代表了几乎没种语言的每个字符!当然,这个列表很长,没有人能记住它 :) 如果你想知道它从何而来,为什么是必要的,请阅读这篇内容丰富的文章:https://docs.oracle.com/javase/tutorial/i18n/text/unicode.html 所有 Unicode 字符代码都采用 “u+<十六进制数字>”的形式。 比如大家熟知的版权符号就由 u00A9 表示。 所以,如果在 Java 中处理文本时需要使用这个字符,可以在文本中对它进行转义! 例如,我们想通知大家 CodeGym 拥有本课的版权:

public class Main {
   public static void main(String[] args) {
       System.out.println("\"Escaping characters\", \u00A9 2019 CodeGym");
   }
}
控制台输出:
"Escaping characters", © 2019 CodeGym
太棒了,一切都解决了! 但这不仅仅对特殊符号有用! 你可以使用 Unicode 和转义字符对用不同语言同时编写的文本进行编码。甚至是用同一种语言的几种不同方言写的文本!

public class Main {
   public static void main(String[] args) {

       System.out.println("\u004d\u0061\u006f \u005a\u0065\u0064\u006f\u006e\u0067 " + 

               "\u0028\u0054\u0072\u0061\u0064\u0069\u0074\u0069\u006f\u006e\u0061\u006c " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6fa4\u6771\u002c " +

               "\u0053\u0069\u006d\u0070\u006c\u0069\u0066\u0069\u0065\u0064 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6cfd\u4e1c\u002c " +

               "\u0050\u0069\u006e\u0079\u0069\u006e\u003a \u004d\u00e1\u006f " +

               "\u005a\u00e9\u0064\u014d\u006e\u0067\u0029 \u0077\u0061\u0073 \u0061 " +

               "\u0032\u0030\u0074\u0068\u002d\u0063\u0065\u006e\u0074\u0075\u0072\u0079 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065 " +

                "\u0073\u0074\u0061\u0074\u0065\u0073\u006d\u0061\u006e\u002c " +

               "\u0070\u006f\u006c\u0069\u0074\u0069\u0063\u0069\u0061\u006e\u002c " +

               "\u0061\u006e\u0064 \u0074\u0068\u0065 \u0063\u0068\u0069\u0065\u0066 " +

               "\u0074\u0068\u0065\u006f\u0072\u0065\u0074\u0069\u0063\u0069\u0061\u006e " +

               "\u006f\u0066 \u004d\u0061\u006f\u0069\u0073\u006d\u002e");
   }
}
Java 转义字符 - 2控制台输出:
Mao Zedong (Traditional Chinese: 毛澤東, Simplified Chinese: 毛泽东, Pinyin: Máo Zédōng) was a 20th-century Chinese statesman, politician, and the chief theoretician of Maoism.
在这个例子中,我们使用字符代码构建了一个由英文和三个(!) 不同类型中文字符构成的字符串 - 繁体、简体和拉丁(拼音)。上面的内容对转义字符进行了大致的介绍!现在,你已经对转义字符有了足够的了解,可以在工作中使用这个很棒的工具了 :)