Java错误?为什么在 utf8 编码中额外的零字节?

标签 java utf-8 character-encoding

下面的代码

public class CharsetProblem {
public static void main(String[] args) {
    //String str = "aaaaaaaaa";
    String str = "aaaaaaaaaa";
    Charset cs1 = Charset.forName("ASCII");
    Charset cs2 = Charset.forName("utf8");

    System.out.println(toHex(cs1.encode(str).array()));
    System.out.println(toHex(cs2.encode(str).array()));

}

public static String toHex(byte[] outputBytes) {

    StringBuilder builder = new StringBuilder();

    for(int i=0; i<outputBytes.length; ++i) {
        builder.append(String.format("%02x", outputBytes[i]));
    }

    return builder.toString();
}
}

返回

61616161616161616161
6161616161616161616100

即utf8 编码返回多余的字节。如果我们减少 a-s,那么我们将没有多余的字节。如果我们采用更多的 a-s,我们可以获得越来越多的多余字节。

为什么?

如何解决这个问题?

最佳答案

您不能只获取支持数组并使用它。 ByteBuffers 有一个 capacity, position and a limit .

System.out.println(cs1.encode(str).remaining());
System.out.println(cs2.encode(str).remaining());

产生:

10
10

试试这个:

public static void main(String[] args) {
  //String str = "aaaaaaaaa";
  String str = "aaaaaaaaaa";
  Charset cs1 = Charset.forName("ASCII");
  Charset cs2 = Charset.forName("utf8");

  System.out.println(toHex(cs1.encode(str)));
  System.out.println(toHex(cs2.encode(str)));
}

public static String toHex(ByteBuffer buff) {
  StringBuilder builder = new StringBuilder();
  while (buff.remaining() > 0) {
    builder.append(String.format("%02x", buff.get()));
  }
  return builder.toString();
}

它产生预期的:

61616161616161616161
61616161616161616161

关于Java错误?为什么在 utf8 编码中额外的零字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319499/

相关文章:

python - 如何使用 python 将 utf-8 字符串转换为 big5?

php - 如何转换json数据?

java - 如何在基于 Python 的机器人框架中包含 Java 测试库

java - Java ClassLoader 实例保存在哪个内存中

java - 模拟私有(private)方法

php - 在 PHP 中获取 ’ 而不是撇号(')

unicode - UTF-8 和 Unicode 有什么区别?

java - 使用Java bufferedreader从URL获取html

javascript - Chrome扩展字符串编码

java - 在 Java 中将二维整数数组压入堆栈