【问题标题】:Scala API with encode special character not working for client [duplicate]具有编码特殊字符的Scala API不适用于客户端[重复]
【发布时间】:2021-10-31 06:41:36
【问题描述】:

我们有这个处理特殊字符的函数。例如此函数会将He shouldn’t be allowed 转换为He shouldn�t be allowed

import io.circe._, io.circe.generic.auto._, 
io.circe.syntax._, io.circe.parser._, io.circe.optics.JsonPath._

private def bytesToJsonCirce(value: Array[Byte]): Json = {
    parse(encodeCharacters(value.map(_.toChar).mkString)) match {
      case Right(x: Json) => x
      case Left(err: ParsingFailure) =>
        logger.error(err.getLocalizedMessage)
        Json.Null
    }
  }  

private def encodeCharacters(x: String): String = {
        val encodeChar = '�'
        (x.toCharArray map {
          case y if y.isControl => encodeChar
          case y => y
        }).mkString
      }

现在我们正在尝试在客户端(python)使用这个 API 响应得到错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 11: ordinal not in range(128) 。如果我们在客户端应用.encode("utf8"),它会回馈He shouldn�t be allowed,但我们会丢失原始表单He shouldn’t be allowed

如果没有.encode("utf8"),也不需要这个UnicodeEncodeError。如何在 scala 前端实现。

【问题讨论】:

  • 我有点困惑,Scala 中到底是服务器端还是客户端?
  • 服务器实际
  • 您的 API 是否生成 JSON 响应? value: Array[Byte] 来自哪里,据我所知是 JSON?
  • 如果 value: Array[Byte] 是一个 UTF-8 编码的字符串,那么将数组的每个元素视为单独的字符是错误的,因为某些字符可能占用超过一个字节。
  • 不是控制字符,因此您给出的示例将保持不变

标签: scala


【解决方案1】:

错误信息显示\ufffd 不是有效的 ASCII 字符:

'ascii' 编解码器无法编码字符 u'\ufffd'

\ufffd 的 Unicode 值,所以问题是替换值 encodeChar 不是有效的 ASCII 值。尝试将 encodeChar 更改为有效的 ASCII 字符。

【讨论】:

  • 我更多的是寻找而不是替换为相同的编码器 ,我可以有一些转义机制来帮助保留实际值。
猜你喜欢
  • 1970-01-01
  • 2020-08-23
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多