在Java中,如果我有一个String x,如何计算该字符串中的字节数?
x
字符串是字符列表(即代码点)。表示字符串所用的字节数完全取决于你使用哪种编码将其转换为字节。
也就是说,你可以将字符串转换为字节数组,然后按如下所示查看其大小:
// The input string for this test final String string = "Hello World"; // Check length, in characters System.out.println(string.length()); // prints "11" // Check encoded sizes final byte[] utf8Bytes = string.getBytes("UTF-8"); System.out.println(utf8Bytes.length); // prints "11" final byte[] utf16Bytes= string.getBytes("UTF-16"); System.out.println(utf16Bytes.length); // prints "24" final byte[] utf32Bytes = string.getBytes("UTF-32"); System.out.println(utf32Bytes.length); // prints "44" final byte[] isoBytes = string.getBytes("ISO-8859-1"); System.out.println(isoBytes.length); // prints "11" final byte[] winBytes = string.getBytes("CP1252"); System.out.println(winBytes.length); // prints "11"
因此,你看到,即使是简单的“ ASCII”字符串,其表示形式也可以具有不同数量的字节,具体取决于所使用的编码。使用你感兴趣的字符集作为的参数getBytes()。并且不要陷入假设UTF-8将每个字符都表示为单个字节的陷阱,因为这也不是真的:
getBytes()
final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms // Check length, in characters System.out.println(interesting.length()); // prints "4" // Check encoded sizes final byte[] utf8Bytes = interesting.getBytes("UTF-8"); System.out.println(utf8Bytes.length); // prints "12" final byte[] utf16Bytes= interesting.getBytes("UTF-16"); System.out.println(utf16Bytes.length); // prints "10" final byte[] utf32Bytes = interesting.getBytes("UTF-32"); System.out.println(utf32Bytes.length); // prints "16" final byte[] isoBytes = interesting.getBytes("ISO-8859-1"); System.out.println(isoBytes.length); // prints "4" (probably encoded "????") final byte[] winBytes = interesting.getBytes("CP1252"); System.out.println(winBytes.length); // prints "4" (probably encoded "????")
(请注意,如果不提供字符集参数,则会使用平台的默认字符集。这在某些情况下可能很有用,但是通常应避免依赖默认值,并且在编码/时始终使用显式字符集需要解码。)