java中的编码字符串长度

Posted

技术标签:

【中文标题】java中的编码字符串长度【英文标题】:Bencoded string length in java 【发布时间】:2015-07-14 13:59:02 【问题描述】:

我对编码有点困惑。

根据规范,当我对字符串进行编码时,我需要使用以下格式:

长度:字符串

字符串 spam 变成 4:spam

我的问题:4是编码字符串的符号数量,还是utf-8字节的数量?

例如,如果我要对字符串 gâteau 进行编码

应该指定什么数字作为这个字符串的长度?

我想我必须指定7,最终的形式应该是7:gâteau

这是因为符号Ⅴ按照utf-8编码占了2个字节,而这个字符串中其余的符号按照utf-8编码占了1个字节。

另外我听说不建议将编码数据存储在java String实例中。

换句话说,当我对数据块进行编码时,我应该将其存储为字节数组,并且不应将其转换为 java String 值以避免编码问题。

我的假设正确吗?

【问题讨论】:

来自***.com/tags/bencoding/info:一个字节串(字节序列,不一定是字符)被编码为:。 [...] 该规范不处理 ASCII 集之外的字符编码。什么不清楚? @JBNizet 谢谢。如果我错了,请纠正我。如果我需要使用非 ascii 字符对字符串进行编码,length 将显示字节数量,而不是字符。对于字符串gâteau,编码形式将如下所示:7:gâteau,正如我在问题中所描述的那样。我说的对吗? 该规范,根据我评论中引用的文本,不支持非 ASCII 字符。所以你不应该首先编码â。但是如果你这样做,鉴于它说它是一个 byte 字符串,长度应该是字节数:7。这就是我读它的方式。 【参考方案1】:

According to the specification,编码字符串是一个字节序列,你必须指定这个序列的字节数作为它的长度。

并且,根据规范:“所有字符串值都是 UTF-8 编码的”。

对于您使用“gâteau”的情况,您应该指定 7 作为长度,因为字符 â 需要 2 个字节。

【讨论】:

谢谢你的详细解释:) 我想澄清一下,“所有字符串值都是 UTF-8 编码的” 是仅对 .torrent 中的 字符串 的特定限制(元信息)文件。它确实通常适用于编码字节字符串,它可以包含任意形式的原始字节字符串。

以上是关于java中的编码字符串长度的主要内容,如果未能解决你的问题,请参考以下文章

(java)如何获取字符串的字节数!

(java)如何获取字符串的字节数!

java char String中涉及到的length字符长度概念的研究

编码之后的字符串和数组长度解惑

Lucene on Maven - java.lang.IllegalArgumentException UTF8编码长度超过最大长度32766错误

行程长度编码的RLE 压缩算法的基本原理