【发布时间】: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