Kotlin中将字符串编码为UTF-8

19

在处理JSON和响应时,通常需要在Java中将字符串编码为UTF-8。

String response = new String(response.data, UTF); // java code

对于Kotlin,应该如何做?我把我的Java类转换了一下,结果是

String response = String(response.data, UTF) // kotlin code

但是这会导致一个错误,因为我认为 Kotlin 的 String() 方法与我在 Java 中所做的不同。是否仅仅使用 toString() 就可以解决问题呢?

String response = response.data.toString() // kotlin code

系统如何知道使用UTF-8,还是默认使用它?如果我想要使用String对象并使用UTF-16,该怎么做来更改编码呢?

系统如何知道使用UTF-8,还是默认使用它?如果我想要使用String对象并使用UTF-16,该怎么做来更改编码呢?


如果你从一些字节数据开始,最终得到一个字符串,那么你不是在解码UTF8吗?(这里的背景是,在Java/Kotlin中,字符是16位的,而UTF-8是一种将这些Unicode字符编码为8位字节的方式。因此,如果response.data已经是UTF-8,则这是解码;否则,我不知道这个问题是关于什么的!) - gidds
4个回答

29

1
谢谢,这应该是被接受的答案,简单、易懂且定义清晰。再次感谢。 - Shujat Munawar

17

使用Kotlin函数作为

charset("UTF-8")

使用您的数据

 String(response.data, charset("UTF-8"))

8

Kotlin提供了多个重载的ByteArray.toString方法,可以接受一个Charset参数。你只需要使用这个方法:array.toString(charset)

我在文档中没有找到说明ByteArray.toString()方法是否正确的部分,因为在Java中它是不正确的,而且这种行为可能会被保留在Kotlin中。我猜测它会做错事。我建议明确地使用toString(charset)方法。


我明白了,很简单。Kotlin 看起来能让事情变得更简单。只需要多学习一些这门语言。谢谢你的回答,我会尝试的。 - portfoliobuilder
ByteArray.stringFromUtf8似乎只能在本地代码中使用? - Gavin

4

Kotlin 1.4提供了一个通用的ByteArray.decodeToString函数。

该函数接受一个ByteArray,其中包含使用utf8编码的字符串字节,并将其解码为Kotlin String。因此,您可以像这样使用它:

val response: String = response.data.decodeToString()

你认为这是更好的方式吗?大概意味着 ByteArray.decodeToString() 将成为新的操作方式,而 ByteArray.toString() 可能会被弃用(或不支持),对吗? - portfoliobuilder
我有同样的想法。今天一直卡在这个问题上,但我无法找到ByteArray.toString()下真正的实现来查看使用了哪种字符集。我认为一定有。 - Vuco
1
使用decodeToString函数,您可以确保它使用UTF-8字符集。 - Ilya
我在toString()方法下找到了实现。如果在复杂对象上调用,Java会执行Object.toString(),如Oracle文档所述,返回一个“文本表示”此对象的字符串,遵循getClass().getName() + '@' + Integer.toHexString(hashCode())的模式。建议为Object类的每个子类覆盖此方法。以防万一有人想知道幕后的事情 :) - Vuco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接