【问题标题】:how to decode Java strings with Unicode escapes etc. from Scala JavaTokenParsers into unescaped strings?如何将带有 Unicode 转义等的 Java 字符串从 Scala JavaTokenParsers 解码为未转义的字符串?
【发布时间】:2012-07-02 10:13:02
【问题描述】:

Scala 中的JavaTokenParsers 提供了方便的正则表达式来匹配整数和浮点数以及双引号字符串。但仅此而已。如何将这些字符串转换回底层转换对象?对于数字,这很容易做到,使用toDoubletoInt 等。但是你如何为字符串做等价的呢?例如。如果我输入字符串

"Unicode \u20ac is a Euro sign, which I would write \\u20ac in a string. \243 is a pound sign.\n\r And \f is a \"form feed\", with embedded quotes.\n\r"

然后我通过JavaTokenParsers 运行它,我将适当地得到一个正确解析嵌入引号的字符串,但它的第一个和最后一个字符有一个双引号字符,以及许多反斜杠序列。如何获得处理了转义序列的等效 Java 字符串?我不敢相信没有库函数可以做到这一点,但找不到。

【问题讨论】:

    标签: parsing scala escaping decode unicode-escapes


    【解决方案1】:

    似乎没有这样的函数——至少在 Scala 编译器中没有使用。不过,这不是一个决定性的答案,也许后来引入了一个库函数。

    如果您想阅读(或复制粘贴)此代码,这里是我找到的相关代码。 Scala 编译器的标记化逻辑分布在不同的文件中。 顶级方法似乎是src/compiler/scala/tools/nsc/ast/parser/Scanners.scala 中的fetchToken,它又委托给src/compiler/scala/tools/nsc/util/CharArrayReader.scala(其祖先之一)中的逻辑,特别是nextCharpotentialUnicode。其他转义在getLitChar 中处理,同样在Scanners.scala 中处理。

    【讨论】:

      【解决方案2】:

      好的,我环顾了一下。关于stackoverflow的另一个问题似乎解决了一个相关问题:

      How to unescape a Java string literal in Java?

      Tom Christiansen 提供了一些源代码。

      我还发现 Apache Commons 有一个功能可以做到这一点:

      org.apache.commons3.lang.StringEscapeUtils.unescapeJava()

      如果要处理八进制转义,则需要使用 Commons 3 版本。 Christiansen 的上述版本具有更多功能,因为它可以处理在其他地方看到的常见转义序列(例如 Java 正则表达式、Perl 和 Python 转义、C 转义),这些在 Java 中不存在:

      1. \a 用于贝尔 (\007),\e 用于 ESC
      2. \UXXXXXXXX 用于 UCS-4 完整的 Unicode 代码点(包括那些不在 BMP 中的代码点)
      3. \xXX 用于十六进制转义
      4. \cX 用于控制转义,例如\cH = ^H = \b = \010
      5. \0 为 NULL (\000)

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 2023-03-31
        • 2011-12-14
        相关资源
        最近更新 更多