【问题标题】:Unescape and get Unicode String in Kotlin在 Kotlin 中取消转义并获取 Unicode 字符串
【发布时间】:2021-02-18 16:47:53
【问题描述】:

我有一个带有字符串的文本文件,

Here is some Bengali letter : \u00E0\u00A6\u00A6\u00E0\u00A7\u0080

应该代表字符串,

Here is some Bengali letter : দী

我对这里的编码/解码感到非常困惑。我试图通过获取字节数组来来回转换字符串,我已经尝试过 StringEscapeUtils,正如这里的一些帖子中所建议的那样!但是都产生了乱码。

我最好的猜测是 Unicode 部分“দী”被 URLEncoded 编码为,

%E0%A6%A6%E0%A7%80

然后以某种方式转换为字符串,

\u00E0\u00A6\u00A6\u00E0\u00A7\u0080

所以我的问题是如何读取文件并在 Kotlin 中获取所需的字符串?

【问题讨论】:

  • 这看起来像经典的mojibake:某些东西接受了一个 UTF-8 字符串并假设它是 Latin-1,并且需要将其转换为 UTF-8。一旦你理解了这一点,扭转它的过程应该是显而易见的和微不足道的。以下是您在 Python 中的操作方式:text = text.encode('latin-1').decode('utf-8')
  • 其实这个字母应该表示为\u09A6\u09C0
  • @tripleee 谢谢!我通过在我的 Kotlin 项目中设置 str = String(str.toByteArray(Charsets.ISO_8859_1)) 来管理 un-mojibake 情况。
  • 我找不到现有的副本,因此可能会将其作为答案发布(并最终接受)。

标签: kotlin unicode utf-8 character-encoding


【解决方案1】:

(回答结束问题)

正如@tripleee 所建议的,该问题已通过将字符串编码为 Latin-1 然后解码为 UTF-8 来解决。

这是 Kotlin 中的 MWE

val originalStr = "Here is some Bengali letter : \u00E0\u00A6\u00A6\u00E0\u00A7\u0080"
val str = String(originalStr.toByteArray(Charsets.ISO_8859_1))
println(str)

Output> Here is some Bengali letter : দী 

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多