【问题标题】:JDK 1.8 on unicode escape characters gives string literal is not properly closed by a double-quote error [duplicate]JDK 1.8 上的 unicode 转义字符给出了双引号错误未正确关闭字符串文字 [重复]
【发布时间】:2016-05-20 06:15:31
【问题描述】:

你好,智能社区,

我已经围绕这个问题进行了一些研究,但似乎无法找到我确切问题的答案

我正面临一个奇怪的编译时问题,其中包含 unicode 转义码的 Java 字符串文字。

这里是正在考虑的代码sn-p:

    String text = textArea.getText().trim();
    String unicodeReturn = "\u000A";
    text = 
            "\"" + 
            text
            .replace(" ", "%s")
            .replace("\\", "\\\\")
            .replace("\"", "\\\"")
            .replace("\n", "\u000A") 
            + 
            "\"";

我收到编译时错误 “字符串文字没有被双引号正确关闭” 用于该行

    String unicodeReturn = "\u000A";

奇怪的是,这条线

    .replace("\n", "\u000A") 

如果存在相同的 unicode 文字,似乎不会导致任何问题。我已经使用 unicode 符号语法有一段时间了。如果我没有记错的话,格式是 \uXXXX,其中 X 是一个十六进制数字。

我的环境是

  • JDK 1.8.0_66
  • MACOSX El Capitan
  • Eclipse Mars.1

我的问题是:

  1. 有人遇到过同样的问题吗?
  2. 这是一个已知的 JDK 1.8 编译器错误吗?
  3. 对此有解决方案或变通方法吗?
  4. 有谁知道我做错了什么?

(这很令人沮丧,让我无法编译我的代码)

【问题讨论】:

标签: java unicode unicode-escapes


【解决方案1】:

\u unicode 被转换之前解析文本所以

String unicodeReturn = "\u000A";

相同
String unicodeReturn = "
";

这是一个完全由\u代码https://stackoverflow.com/a/30727799/57695组成的Hello World程序示例

\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

你可以这样做

.replace("\n", "\\u000A")

或者只是

.replace("\n", "\\n")

【讨论】:

  • 感谢@PeterLawrey,似乎 \u000A 确实对源代码产生了一些奇怪的影响,这有效地阻止了程序员使用 unicode 新行。不幸的是,\\u000A 不是一个选项,因为它将转换为“\u000A”字符序列而不是回车符号。这个问题的有趣方面是我的第二行代码没有导致编译器错误,只有第一行。你知道为什么吗?
  • @NarGar 你已经有了回车符号\n 我确实解释了为什么你可以在字符串中使用\u000a 所以这一点都不奇怪。你的第二行对我来说也是一个错误,我建议你的编译器因为前一个错误而没有向你显示错误。
  • 我的用例不同,我正在构建的字符串是 adb shell 的 shell 命令,我不能有 \n。不太确定 \u000A 是否是解决方案,但我正在做一些试验和错误。如果您知道在 adb shell 命令中使用回车表示的好方法,我会很高兴学习这种方法。
  • @NarGar 我不清楚你需要做什么。 adb 处理 \n AFAIK。
  • adb shell 输入文本命令不为我处理 \n。尝试过各种各样的东西。我正在使用 Android SDK 23
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多