一个包含特殊字符如ç
的JavaString在每个特殊字符上占用两个字节的大小,但是使用String length method或从getBytes method返回的字节数组获取其长度时,特殊字符并不会被计算为两个字节。
我该如何正确计算String中的字节数?
例子:
单词endereço
应该返回长度9而不是8。
一个包含特殊字符如ç
的JavaString在每个特殊字符上占用两个字节的大小,但是使用String length method或从getBytes method返回的字节数组获取其长度时,特殊字符并不会被计算为两个字节。
我该如何正确计算String中的字节数?
例子:
单词endereço
应该返回长度9而不是8。
"endereço"
中,如果getBytes()
返回大小为8而不是9的数组,则意味着您的操作系统不使用默认的UTF-8
字符集,而是使用1个字节固定宽度的字符集,例如ISO 8859-1
及其派生字符集,如基于Windows操作系统的windows-1252
。Charset defaultCharset = Charset.defaultCharset()
。byte[] getBytes()
方法带有另外两个非常有用的重载:byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException
- byte[] java.lang.String.getBytes(Charset charset)
与没有参数的getBytes()
方法相反,这些方法允许指定在字节编码期间要使用的字符集。
byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException
Javadoc:byte[] java.lang.String.getBytes(Charset charset)
Javadoc:getBytes(String charsetName)
获取UTF-8
编码的字节数组,可以这样做:String yourString = "endereço";
byte[] bytes = yourString.getBytes("UTF-8");
int sizeInBytes = bytes.length;
你将得到一个9字节的长度,与你所希望的一样。
以下是更全面的示例,包括默认编码显示,使用默认字符集平台的字节编码,UTF-8
和UTF-16
:
public static void main(String[] args) throws UnsupportedEncodingException {
// default charset
Charset defaultCharset = Charset.defaultCharset();
System.out.println("default charset = " + defaultCharset);
// String sample
String yourString = "endereço";
// getBytes() with default platform encoding
System.out.println("getBytes() with default charset, size = " + yourString.getBytes().length + System.lineSeparator());
// getBytes() with specific charset UTF-8
System.out.println("getBytes(\"UTF-8\"), size = " + yourString.getBytes("UTF-8").length);
System.out.println("getBytes(StandardCharsets.UTF_8), size = " + yourString.getBytes(StandardCharsets.UTF_8).length + System.lineSeparator());
// getBytes() with specific charset UTF-16
System.out.println("getBytes(\"UTF-16\"), size = " + yourString.getBytes("UTF-16").length);
System.out.println("getBytes(StandardCharsets.UTF_16), size = " + yourString.getBytes(StandardCharsets.UTF_16).length);
}
我在使用Windows操作系统的电脑上看到的输出:
默认字符集 = windows-1252
使用默认字符集的getBytes(),大小为8
getBytes("UTF-8"),大小为9
getBytes(StandardCharsets.UTF_8),大小为9
getBytes("UTF-16"),大小为18
getBytes(StandardCharsets.UTF_16),大小为18
char
?”我已经更新了。感谢您提出这个相关的评论 :) - davidxxx
System.out.println("endereço".getBytes().length);
时,它会打印出 "9"。 - briarheartgetBytes()
使用平台默认编码,可能已经是UTF-8
。请参阅:不同平台上的平台默认字符集? - avojakendereço
,在ISO-8859-1
编码下为 8,UTF-8
编码下为 9,EUC-JP
编码下为 10,UTF-16BE
编码下为 16,UTF-32
编码下为 32。 - Andreas