请问java默认的字符集是utf8是吗,那么下面这个

来源:百度知道 编辑:UC知道 时间:2024/09/26 20:16:50
String s = "hello我的英雄";
System.out.println(s.getBytes("utf-8").length);
输出16,utf-8编码,一般情况英文字符一个字节,中文字符三个字节。

java默认的编码不是就是utf-8吗,号称所有字符都是2个字节的,怎么回事呢

呃,以前没注意到呢。

java是定义了char为两个字节,同时String的实现也是用char数组的,这应该就是说String是两个字节字符构成的了。可是UTF8规定是英文字符一个字节,中文字符三个字节。这样貌似说java的字符村在内部是用UTF8编码的就貌似矛盾了。

在维基百科上有这么一段话:在通常用法下,Java程序语言在通过InputStreamReader 和OutputStreamWriter读取和写入串的时候支持标准UTF-8。而没有说到java字符串到底是不是UTF8构成的。
同时我们知道java字面转义是\uxxxx的,也就是两个字节的,也就是两个字节确实可以编码所有字符才对。

补充:
好吧,差了资料,在类 Character的文档里面看到了这么些东西。
“char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。”

嗯,也就是说Unicode原先是定义为2个字节的,但是后来改动了,进行了扩展。而java语言在定义的时候已经定义了char为2个字节,所以Unicode改了java却不能跟着把语言的基础也改了,所以又有——“从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 ”也就是用两个char字符来表示一个Unicode值。

总的来说就是char还是两个字节的,但是在表示一些特殊字符的时候需要用到两个连续的cha