请问java默认的字符集是utf8是吗,那么下面这个
Strings="hello我的英雄";System.out.println(s.getBytes("utf-8").length);输出16,utf-8编码,一般情况英...
String s = "hello我的英雄";
System.out.println(s.getBytes("utf-8").length);
输出16,utf-8编码,一般情况英文字符一个字节,中文字符三个字节。
java默认的编码不是就是utf-8吗,号称所有字符都是2个字节的,怎么回事呢 展开
System.out.println(s.getBytes("utf-8").length);
输出16,utf-8编码,一般情况英文字符一个字节,中文字符三个字节。
java默认的编码不是就是utf-8吗,号称所有字符都是2个字节的,怎么回事呢 展开
2个回答
推荐于2016-10-03
展开全部
呃,以前没注意到呢。
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还是两个字节的,但是在表示一些特殊字符的时候需要用到两个连续的char来表示,同时String通过保存了一个char序列来表示字符串。而String的getBytes("utf-8")获得的则是现在标准的UTF8编码字节序列,所以得到的是一个字母是一个字节,一个汉字是三个字节的结果。
哎~~也是乱七八糟的描述,鬼知道Unicode要变动呢这是。。
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还是两个字节的,但是在表示一些特殊字符的时候需要用到两个连续的char来表示,同时String通过保存了一个char序列来表示字符串。而String的getBytes("utf-8")获得的则是现在标准的UTF8编码字节序列,所以得到的是一个字母是一个字节,一个汉字是三个字节的结果。
哎~~也是乱七八糟的描述,鬼知道Unicode要变动呢这是。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询