【问题标题】:scala convert string to a special characterscala将字符串转换为特殊字符
【发布时间】:2019-02-17 13:21:07
【问题描述】:

所以我试图从文件中读取转义字符,由于大量清理,这是一个漫长而复杂的过程,但这一切都无关紧要。最终产品是对象的这个属性 -

props.inputSeperator: String type

现在这是一个字符串。但是,在这种特定情况下,这个字符串的值是\u0001

当我打印这个时,输出是\u0001。并且字符串props.inputSeperator 的长度为6。如何将这个字符串转换为单个字符的字符串?这将是由\u0001 表示的特殊字符因此字符串的长度将为1,并且在打印时将打印一个特殊字符(\u0001

val x: String = "\u0001"
val s = Array("\\", "u", "0", "0", "0", "1").mkString("")
println(x) //prints "?"   this is a SINGLE special character
println(s) //prints "\u0001"

我想取 s,并把它变成 x 的值。

【问题讨论】:

  • 没有得到你的问题。请给出输入示例字符串,输出是什么
  • @ChandanRay 我有一个字符串值\u0001,它的长度为 6(由于某种原因,它没有被存储为单个字符,它应该是)。我想将此字符串转换为单个字符,它应该是特殊的转义字符\u0001。这有意义吗?
  • @ChandanRay 请注意,如果您执行val x: String = "\u0001",它将正确存储为单个字符,但是,我将值读入字符串的方式并非如此。并且这部分程序不能更改。我们要把字符串值`x = "\u0001"`作为一个6字符的字符串,转换成正确的1字符的字符串。
  • @ChandanRay 这是一个可测试的示例val s = Array("\\", "u", "0", "0", "0", "1").mkString("") 我希望将s 转换为单个字符。

标签: scala unicode escaping


【解决方案1】:

只要使用commons.text.StringEscapeUtils中的unescapeJava方法即可:

libraryDependencies += "org.apache.commons" % "commons-text" % "1.4"

例子:

println(org.apache.commons.text.StringEscapeUtils.unescapeJava("\\u046C"))

打印:

Ѭ

【讨论】:

【解决方案2】:

去掉不需要的字符,解析十六进制字符串,变成Char

Integer.parseInt("\\u0A6E".drop(2), 16).toChar
res0: Char = ੮

【讨论】:

  • 在这种情况下,没有依赖比某些依赖更好。
  • @erip 如果您可以绝对保证只有 this one 这个包含单个字符的特定字符串存在单个孤立的编码问题...也许。不幸的是,编码问题通常不会单独出现......
  • 当然。我是语言学家——我了解编码问题。 :^) 我的观点是,鉴于 OP 提出的奇怪要求,这是一个可爱且侵入性更小的解决方案。
【解决方案3】:

您在 ascii 文字中有 UNICODE 值。要获取 unicode 值,您只需忽略“\”和“u”,并使用滑动(2,2)格式将字符串的其余部分读取为十六进制值。然后通过指定您需要的编码(即 UNICODE)将结果字符串传递给“新字符串”。

scala> val ar = Array("\\", "u", "0", "0", "0", "1").mkString("")
ar: String = \u0001

scala> val x = new String( ar.drop(2).sliding(2,2).toArray.map(Integer.parseInt(_, 16).toByte) , "UNICODE")
x: String = ?

scala>  x.length
res53: Int = 1

scala>  x.toArray.map(_.toByte)
res54: Array[Byte] = Array(1)

scala>

验证:

scala> val x1: String = "\u0001"
x1: String = ?

scala> x==x1
res55: Boolean = true

scala>

【讨论】:

    【解决方案4】:

    val delim :Byte = "\u0007".codePointAt(0).toByte

    我们可以使用 codePointAt() 方法然后使用 toByte

    【讨论】:

    • 您的答案使用 1 个字符的字符串作为输入,这是 OP 想要的输出。这不能回答问题;)
    猜你喜欢
    • 2015-04-28
    • 2013-03-08
    • 2015-02-20
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多