我的目标是节省数据存储空间,只接受字符串。
因为Java中的String是一个16位数组,所以我认为理论上我应该能够将我的8字节长转换为4字符串,因为它们都由8个字节表示。 (为了清楚起见,我对在基数10中使用人类可读的长整数不感兴趣,我希望将它尽可能地存储在字符串中。)
然而,我在此发现的几乎所有文献都是关于转换为8位字节类型,而不是char类型。
我可以编码为UTF8。我担心这意味着我将String的长度加倍,因为每个8位字节都存储为16位字符。这首先打破了我将数据压缩成64位介质的全部目的。
private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
new String(ByteBuffer.allocate(8).putLong(value).array(), UTF8_CHARSET);
我的担忧是否正确,我会浪费空间,如果是这样,有没有办法不浪费空间?
答案 0 :(得分:2)
char != int
问:是否有任何UTF未生成的字节序列?怎么样 我应该解读一下吗?
答:没有UTF可以生成每个任意字节序列。 For 例如,在UTF-8中,必须遵循110xxxxx2格式的每个字节 使用10xxxxxx2格式的字节。序列如< 110xxxxx2 0xxxxxxx2>是非法的,绝不能生成。面对时 这个非法字节序列在转换或解释时是UTF-8 符合过程必须将第一个字节110xxxxx2视为非法 终止错误:例如,发出错误信号,过滤 字节输出,或用FFFD等标记表示字节 (替换字符)。在后两种情况下,它将继续下去 处理第二个字节0xxxxxxx2。
符合要求的过程不得解释非法或格式错误的字节 但是,序列作为字符可能需要进行错误恢复操作。 没有一致的过程可能使用不规则的字节序列来编码 带外信息。
String != byte[] && char != int
内部String
个对象为Unicode
,无论其来源是什么,都会编码为UTF-16
。
如何在Java平台中表示文本?
Java编程语言基于Unicode字符集, 并且有几个库实现了Unicode标准。原始人 Java编程语言中的数据类型char是无符号的16位 整数,表示U + 0000到的范围内的Unicode代码点 U + FFFF,或UTF-16的代码单位。各种类型和类别 表示字符序列的Java平台 - char [], java.lang.CharSequence的实现(例如String类), 和java.text.CharacterIterator的实现 - 是UTF-16 序列。
String
在内部由UTF-16
UTF-8
等字符编码仅适用于解释或转换与byte[]
之间的关联。
即使您编写自定义CharsetProvider
,所有操作都会对byte[]
外部进行编码/解码,这绝对会不更改事实上是String
is internally represented by UTF-16
,所以你想做的事情是毫无意义的。