java为什么UTF8的新字符串包含更多字节
byte bytes[] = new byte[16];
random.nextBytes(bytes);
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
log.warn("Hash generation failed", e);
}
当我用给定的方法生成一个字符串时,当我应用string.getBytes().length
时,它会返回一些其他值。麦克斯32岁。为什么16字节数组最终会生成另一个大小的字节字符串
但如果我这样做string.length()
,它会返回16
# 1 楼答案
生成的字节可能包含有效的多字节字符
以此为例。字符串只包含一个字符,但作为字节表示,它需要三个字节
String.length()
返回字符串的长度(以字符为单位)。字符Ω
是一个字符,而在UTF-8中是一个3字节长的字符如果你像这样修改代码
相同的字节用不同的字符集进行解释。在
String(byte[] b, String charset)
的javadoc之后# 2 楼答案
经典错误源于对
byte
和char
之间关系的误解,所以我们再来一遍在)
byte
和char
之间没有1对1的映射;这完全取决于所使用的字符编码(在Java中,即^{更糟糕的是:给定一个
byte
序列,它可能或被编码为char
序列试试这个例子:
这很可能会引发
MalformedInputException
我知道这不完全是一个答案,但你没有清楚地解释你的问题;上面的例子已经表明,你对什么是
byte
和什么是char
有错误的理解# 3 楼答案
字符串。getBytes()。length可能更长,因为它计算表示字符串所需的字节数,而length()计算2字节的代码单位
阅读更多here