【发布时间】:2011-04-12 12:02:28
【问题描述】:
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题:
使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成了UTF-8编码的8位字符,但是java中每个UTF-8字符都保存为16位字符。那是对的吗? 如果是,这意味着每个愚蠢的 java 字符只使用前 8 位,并消耗双倍的内存?这也正确吗?我想知道这种浪费行为是如何被接受的......
是不是有一些技巧来拥有一个 8 位的伪字符串?这实际上会导致更少的内存消耗吗? 或者,有没有办法在一个java 16位字符中存储>两个
感谢您提供任何令人困惑的答案...
编辑: 你好,谢谢大家的回答。我知道 UTF-8 的可变长度属性。但是,由于我的源是 8 位字节,我理解(显然是错误的)它只需要 8 位 UTF-8 字。 UTF-8 转换是否实际上保存了您在 CLI 上执行“cat somebinary”时看到的奇怪符号?我认为 UTF-8 只是以某种方式用于将字节的每个可能的 8 位字映射到 UTF-8 的一个特定的 8 位字。错误的?我考虑过使用 Base64,但它很糟糕,因为它只使用 7 位..
问题重新表述:有没有更聪明的方法将字节转换为字符串? 可能最喜欢的是将 byte[] 转换为 char[],但我仍然有 16 位字。
其他用例信息:
我将Jedis(NoSQL Redis 的 java 客户端)改编为 hypergraphDB 的“原始存储层”。所以,jedis是另一个“数据库”的数据库。 我的问题是我必须一直为 jedis 提供 byte[] 数据,但在内部,>Redis 字符串转换并使用那个Filteroutputstream...?)
现在我想知道:如果我必须一直相互转换 byte[] 和 String,数据大小从非常小到可能非常大,将每个 8 位字符传递为java中的16位?
【问题讨论】:
-
您知道某些 UTF-8 字符是 2、3 或 4 个字节,对吧?全世界都不用ASCII。
-
嗨,谢谢大家的回答。我知道 UTF-8 的可变长度属性。但是,由于我的源是 8 位字节,我知道它只需要 8 位 UTF-8 字。不是这样吗? UTF-8 转换是否实际上保存了您在 CLI 上执行“cat somebinary”时看到的奇怪符号?我认为 UTF-8 只是以某种方式用于将字节的每个可能的 8 位字映射到 UTF-8 的一个 8 位字。错误的?我考虑过使用 Base64,但它很糟糕,因为它只使用 7 位..
-
UTF-16 也是一种可变宽度编码,就像 UTF-8 一样。它只是使用更大的代码单元。
-
将两个字节转换为一个字符有什么不好?
-
您可以对其进行 Huffman 编码,以便最常见的代码点占用最少的位,反之亦然。因此,每个文档都需要一个不同的前置查找字典,将位映射到代码点。这将是一种虚假的效率。
标签: java memory utf-8 byte 8-bit