为什么转义序列可以';在java中不能表示为UnicodeScape?

为什么转义序列可以';在java中不能表示为UnicodeScape?,java,ansi-escape,Java,Ansi Escape,在爪哇 “回车”表示为'\r' & “换行符”表示为'\n' 但是Java不允许 “回车”为'\u000d' 及 “换行符”为'\u000a' 为什么?在源代码转换中,Unicode转义序列比字符文字转义序列应用得更早。Unicode转义序列在转换过程中很早就被转换了——在任何其他词法转换发生之前,包括在检测到换行之前。有关详细信息,请参阅 因此,当您将\u000a放入Java源文件时,它的行为将与您在其中放入实际换行符的行为完全相同—就编译器的其余部分而言,这会导致换行符 (我个人认为这是一个

在爪哇

“回车”表示为
'\r'

&

“换行符”表示为
'\n'

但是Java不允许

“回车”为
'\u000d'

“换行符”为
'\u000a'


为什么?

在源代码转换中,Unicode转义序列比字符文字转义序列应用得更早。Unicode转义序列在转换过程中很早就被转换了——在任何其他词法转换发生之前,包括在检测到换行之前。有关详细信息,请参阅

因此,当您将
\u000a
放入Java源文件时,它的行为将与您在其中放入实际换行符的行为完全相同—就编译器的其余部分而言,这会导致换行符


(我个人认为这是一个设计错误;我更喜欢C#方法,只允许在代码中非常特定的点使用Unicode转义序列,但这是另一回事。)

Unicode转义序列在源代码转换中应用得比字符文字转义序列更早。Unicode转义序列在转换过程中很早就被转换了——在任何其他词法转换发生之前,包括在检测到换行之前。有关详细信息,请参阅

因此,当您将
\u000a
放入Java源文件时,它的行为将与您在其中放入实际换行符的行为完全相同—就编译器的其余部分而言,这会导致换行符


(我个人认为这是一个设计错误;我更喜欢C#方法,只允许在代码中非常特定的点上使用Unicode转义序列,但这是另一回事。)

Unicode转义在Java源文件中的任何位置都可以识别,而不仅仅是在字符串文本中,并且在编译器链的早期处理。
\u000d
被视为文本回车,而不是转义回车,即对于源代码

String cr = "\u000d";
编译器看到的是

String cr = "
";

这不是合法的Java代码。

Unicode转义在Java源文件中的任何位置都可以识别,而不仅仅是在字符串文本中,并且在编译器链的早期就被处理。
\u000d
被视为文本回车,而不是转义回车,即对于源代码

String cr = "\u000d";
编译器看到的是

String cr = "
";

这不是合法的Java代码。

记住Java允许标识符中有非常广泛的字符。我相信这样做的目的是允许使用有限(例如ASCII)文本编辑器的人在字符串文本之外包含这些字符。这就是说,在分析文字之前,此类文字不在双引号或撇号(即字符串或字符文字)之间替换的规则是实用的,并且可以同时用于这两个目的。@DanAllen:C#允许标识符中的转义序列,甚至有一个
@
前缀允许关键字用作标识符。基本上,它是可行的,使其比字符文字更广泛,而不使其适用于任何地方。我同意。我指出了我认为Java是如何发展到现在这个地步的。我要说的是“错失的机会”,而不是“设计错误”。但是区别是非常细微的,当然不值得争论。我相信这样做的目的是允许使用有限(例如ASCII)文本编辑器的人在字符串文本之外包含这些字符。这就是说,在分析文字之前,此类文字不在双引号或撇号(即字符串或字符文字)之间替换的规则是实用的,并且可以同时用于这两个目的。@DanAllen:C#允许标识符中的转义序列,甚至有一个
@
前缀允许关键字用作标识符。基本上,它是可行的,使其比字符文字更广泛,而不使其适用于任何地方。我同意。我指出了我认为Java是如何发展到现在这个地步的。我要说的是“错失的机会”,而不是“设计错误”。但这种区别很好,当然不值得争论。但为什么编译器会用双引号来解释它呢。字符串文本中的内容不是用于解析文件,而是出于词法原因。另一方面,答案很好地解释了这一点——Java允许标识符中有广泛的Unicode字符,因此早期对
\unnn
转义的处理提供了一种表示源代码的方法,其中包括非ASCII字符,这种方法在Unicode不安全的情况下非常可靠(例如,Mac用户和Windows用户共享源代码,但在其文本编辑器上使用不同的默认编码)。但为什么编译器会用双引号解释它。字符串文字中的内容不是用于解析文件,而是出于词法原因。另一方面,答案很好地解释了这一点-Java允许标识符中有大量Unicode字符,因此早期处理
\unnn
转义提供了一种表示源c的方法ode,包括非ASCII字符,在Unicode可能不安全的情况下(例如,Mac用户和Windows用户共享源代码,但在其文本编辑器上使用不同的默认编码)非常健壮。