无法转换的Unicode符号西里尔(Can't convert unicode symbol

2019-08-16 22:36发布

我有一大堆的文件中的Apache Lucene的坚持与俄罗斯的一些名字,当我试图把它们打印出来,它看起来像这样"\u0410\u0441\u043f\u0430\u0440" ,但不是在西里尔符号。 该项目是在Scala中。 我试图与Apache下议院解决这个unescapeJava方法,但它并没有帮助。 是否还有其他选择吗?

更新简介:项目writen喷雾框架并返回JSON这样。

{
  "id" : 0,
  "name" : "\u0410\u0441\u043f\u0430\u0440"
}

Answer 1:

我要去尝试推断你在做什么。 您正在使用喷雾,所以我推测,您使用的是它的JSON库“喷雾JSON”

所以我想,你有一些实例spray.json.JsObject ,和您在您的问题发布什么是什么您在打印这种情况时,你得到的输出。 您的JSON对象是正确的,价值name字段没有嵌入式转义,它实际上是转换为字符串逃脱一些Unicode字符。

见定义printString这里: https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/JsonPrinter.scala

我也认为,当您尝试使用unescapeJava ,你应用它的价值name字段中,创建一个新的spray.json.JsObject实例,你再印像以前一样。 鉴于您的JSON对象实际上没有进行转义处理,在打印时,打印机将逃逸不如以前了,你又回到了起点,这并没有什么是绝对,然后。

作为一个侧面说明,这是值得一提的是,JSON规范并不强制字符编码方式:可将它们存储为自己的字面值,或者为Unicode逃逸。 举例字符串"abc"可以描述为只是"abc" ,或"\u0061\u0062\u0063" 。 无论哪种形式是正确的。 碰巧的是喷雾JSON笔者决定采用后者,是所有非ASCII字符。

所以,现在你问,我能做些什么来解决此问题? 你可以问喷雾JSON笔者补充一点,让您可以指定不希望任何Unicode逃逸的选项。 但我想,你想办法解决现在

做最简单的事情就是刚刚你的对象转换为字符串(通过JsValue.toStringJsValue.compactPrintJsValue.prettyPrint ), 然后结果传递给unescapeJava 。 至少,这会给你回你的西里尔原始字符。 但是,这是一个有点恶心了,和一些字符是不安全的字符串文本内反转义其实是相当危险的。 举例: \n将被转义为实际的回报, \u0022将被转义,以"你可以很容易地看到它是如何打破你的JSON文件,但起码它将使确认我的理论(记得我。已作出有关究竟你正在做的假设)。

现在,一个适当的解决办法:你可以简单地扩展JsonPrinter并覆盖其printString方法来删除的Unicode escapting。 事情是这样的(未经测试):

trait NoUnicodeEscJsonPrinter extends JsonPrinter {
  override protected def printString(s: String, sb: StringBuilder) {
    @tailrec
    def printEscaped(s: String, ix: Int) {
      if (ix < s.length) {
        s.charAt(ix) match {
          case '"' => sb.append("\\\"")
          case '\\' => sb.append("\\\\")
          case x if 0x20 <= x && x < 0x7F => sb.append(x)
          case '\b' => sb.append("\\b")
          case '\f' => sb.append("\\f")
          case '\n' => sb.append("\\n")
          case '\r' => sb.append("\\r")
          case '\t' => sb.append("\\t")
          case x => sb.append(x)
        }
        printEscaped(s, ix + 1)
      }
    }
    sb.append('"')
    printEscaped(s, 0)
    sb.append('"')
  }
}

trait NoUnicodeEscPrettyPrinter  extends PrettyPrinter with NoUnicodeEscJsonPrinter
object NoUnicodeEscPrettyPrinter extends NoUnicodeEscPrettyPrinter

trait NoUnicodeEscCompactPrinter   extends CompactPrinter  with NoUnicodeEscJsonPrinter
object NoUnicodeEscCompactPrinter  extends NoUnicodeEscCompactPrinter

然后,你可以这样做:

val json: JsValue = ...
val jsonString: String = NoUnicodeEscPrettyPrinter( json )

jsonString将包含在美丽的打印格式,没有任何unicde转义的JSON文档。



Answer 2:

这个问题出现在喷雾JSON 1.3.2予以纠正: https://github.com/spray/spray-json/issues/46

我跑进使用阿卡HTTP 1.0,这取决于1.3.1阿拉伯字符类似的问题。 通过升级到1.3.2,我的问题就解决了。



文章来源: Can't convert unicode symbols to cyrillic