Java-将字符数组转换为字节数组-长度don';不匹配
我有一些将字符数组转换为字节数组的代码(不需要创建任何中间字符串,这是一个要求),最后我得到了一些额外的字节。下面是一些说明问题的测试代码:Java-将字符数组转换为字节数组-长度don';不匹配,java,Java,我有一些将字符数组转换为字节数组的代码(不需要创建任何中间字符串,这是一个要求),最后我得到了一些额外的字节。下面是一些说明问题的测试代码: String s = "TomJSawyer"; System.out.println("Original String length = " + s.length( )); char[] caOrig = s.toCharArray( ); System.out.println("Original Char Array Length = " + c
String s = "TomJSawyer";
System.out.println("Original String length = " + s.length( ));
char[] caOrig = s.toCharArray( );
System.out.println("Original Char Array Length = " + caOrig.length);
byte[] ba1 = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)).array();
System.out.println("byte array converted from char array length = " + ba1.length);
byte[] ba2 = s.toString( ).getBytes("UTF-8");
System.out.println("byte array converted from String length = " + ba2.length);
下面是在Winodows上jdk160_24上运行的输出
Original String length = 10
Original Char Array Length = 10
byte array converted from char array length = 11
byte array converted from String length = 10
使用字符集从字符数组转换而来的额外字节为零值。随着输入字符串变长,附加到字节数组末尾的零字节数将增加。我希望这与编码有关,但似乎我在两个地方都指定了UTF-8,所以我不知道为什么会这样
如果有人能向我解释发生了什么,或者能为我指明正确的方向,我会非常感激。提前感谢。如果您不必使用
char[]
,您可以使用StringBuffer
:
StringBuffer sb = "TomJSawyer";
String.valueOf(sb).getBytes();
报告说:
返回:
一种新分配的字节缓冲区,包含编码操作的结果。缓冲区的位置将为零,其限制将跟随写入的最后一个字节
您错误地认为ByteBuffer的整个支持数组都是有效数据。您应该只查看ByteBuffer的字节。事实上,CharsetEncoder.encode方法不能保证返回的ByteBuffer甚至由数组支持,因此您根本不应该调用array()
阅读ByteBuffer的可靠方法是:
ByteBuffer buffer = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig));
byte[] ba1 = new byte[buffer.limit()];
buffer.get(ba1);
在许多情况下,字符数组大小与字节数组大小不同。当我在字符数组中使用中文或日文字符时,它们是不同的。我刚刚修复了我的应用程序中与此相关的一个bug 以下是使用中文字符的测试片段:
public static void main(String[] args) throws Exception {
char[] chars = new char[] { '中', '国' };
System.out.println("string content: " + new String(chars));
System.out.println("char array size: " + chars.length);
byte[] bytes = new String(chars).getBytes("UTF-8");
System.out.println("byte array size: " + bytes.length);
System.out.println("converted string content: " + new String(bytes, "UTF-8"));
}
以下是控制台的输出:
string content: 中国
char array size: 2
byte array size: 6
converted string content: 中国
不要再犯我犯的错误。StringBuffer sb=“TomJSawyer”;谢谢你的想法。不幸的是,String.valueOf()创建了一个中间字符串,这正是我试图避免的。谢谢VGR。这就是答案。我真的很感激。我是这个网站的新手。是否有办法标记此问题的答案?From:“要将答案标记为已接受,请单击答案旁边的复选标记,将其从空心切换为绿色(请参见下面的屏幕截图)”