Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-不带Apache的Unicode字符串_Scala_Unicode - Fatal编程技术网

Scala-不带Apache的Unicode字符串

Scala-不带Apache的Unicode字符串,scala,unicode,Scala,Unicode,我有一个字符串“b\u00f4lovar”,我想知道不使用Commons-lang是否可以取消scape。它可以工作,但我在某些环境中遇到了问题,我希望将其最小化(即:它在我的机器上工作,但在生产中不工作) 没有ApacheLib,我怎么能取消它 提前感谢。只有Unicode转义 如果您只想以\u0000格式取消扫描序列,只需一个正则表达式替换即可: def unescapeUnicode(str: String): String = """\\u+([0-9a-fA-F]{4})""".r

我有一个字符串“b\u00f4lovar”,我想知道不使用Commons-lang是否可以取消scape。它可以工作,但我在某些环境中遇到了问题,我希望将其最小化(即:它在我的机器上工作,但在生产中不工作)

没有ApacheLib,我怎么能取消它

提前感谢。

只有Unicode转义 如果您只想以
\u0000
格式取消扫描序列,只需一个正则表达式替换即可:

def unescapeUnicode(str: String): String =
  """\\u+([0-9a-fA-F]{4})""".r.replaceAllIn(str,
    m => Integer.parseInt(m.group(1), 16).toChar match {
      case '\\' => """\\"""
      case '$' => """\$"""
      case c => c.toString
    })
结果是

scala> unescapeUnicode("b\\u00f4lovar \\u30B7")
res1: String = bôlovar シ
我们必须分别处理字符
$
\
,因为它们被
java.util.regex.Matcher.appendReplacement
方法视为特殊字符:

def wrongUnescape(str: String): String =
  """\\u([0-9a-fA-F]{4})""".r.replaceAllIn(str,
    m => Integer.parseInt(m.group(1), 16).toChar.toString)

scala> wrongUnescape("\\u00" + Integer.toString('$', 16))
java.lang.IllegalArgumentException: Illegal group reference: group index is missing
  at java.util.regex.Matcher.appendReplacement(Matcher.java:819)
  ... 46 elided

scala> wrongUnescape("\\u00" + Integer.toString('\\', 16))
java.lang.IllegalArgumentException: character to be escaped is missing
   at java.util.regex.Matcher.appendReplacement(Matcher.java:809)
   ... 46 elided
所有转义字符 Unicode字符转义有点特殊:它们不是字符串文字的一部分,而是程序代码的一部分。有一个单独的阶段用字符替换unicode转义:

scala> Integer.toString('a', 16)
res2: String = 61

scala> val \u0061 = "foo"
a: String = foo

scala> // first \u005c is replaced with a backslash, and then \t is replaced with a tab.
scala> "\u005ct"
res3: String = "    " 
Scala库中有一个函数
StringContext.treatEscapes
,它支持语言规范中的所有内容

因此,如果您想支持unicode转义和所有普通Scala转义,可以按顺序取消转义:

def unescape(str: String): String =
  StringContext.treatEscapes(unescapeUnicode(str))

scala> unescape("\\u0061\\n\\u0062")
res4: String =
a
b

scala> unescape("\\u005ct")
res5: String = "    "

编写自己的例程来解析十六进制数字并生成一个字符。
def unescape(str: String): String =
  StringContext.treatEscapes(unescapeUnicode(str))

scala> unescape("\\u0061\\n\\u0062")
res4: String =
a
b

scala> unescape("\\u005ct")
res5: String = "    "