下面的代码
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/