簡體   English   中英

Scala - 沒有Apache的unescape Unicode字符串

[英]Scala - unescape Unicode String without Apache

我有一個字符串“b \\ u00f4lovar”,我想知道是否可以在不使用Commons-lang的情況下進行unescape。 它的工作原理,但我在一些環境中遇到問題,我想最小化它(即:它適用於我的機器,但不適用於生產)。

StringEscapeUtils.unescapeJava(variables.getOrElse("name", ""))

如何在沒有apache lib的情況下解決它?

預先感謝。

只有Unicode轉義

如果你想使用格式\格式化序列,那么使用單個正則表達式替換它很簡單:

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 = "    "

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM