String str = "中国";
try {
byte[] b = str.getBytes("UTF-8");
System.out.println("getBytes =" + b.length);
System.out.println("str = " + new String(b,"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}1.为什么 加“utf-8”,输出 字节数组长度为6,不加时为 4.
2.默认的字符集是什么,该怎样查看默认字符集
3.如果把“utf-8”改成ascii ,那还能转换回原来的中文吗。 ? 说下标准理由吧。
不加时为4是因为不加时它按照默认的字符编码来进行解码,而中文的操作系统默认的字符编码
一般是GBK,在GBK编码中一个汉字是占2个字节的
2.要查看当前Java虚拟机使用的默认字符集,可以这样做System.out.println(Charset.defaultCharset());3.不能转换回中文,ascii字符集里只有英文,没有中文
如果 str = “中国人” , 输出长度为8 。 你的“在UTF-8中一个汉字要用3个字节来存储的” 不怎么对哦。
因为默认的字符集是utf-16
2.默认的字符集是什么,该怎样查看默认字符集
默认的字符集是utf-16
在api里有说明
char Charater String都是UTF-16编码
3.如果把“utf-8”改成ascii ,那还能转换回原来的中文吗。 ? 说下标准理由吧。
能转回中文,只要得到byte数组用的字符集和转回用的是同一个字符集,转回后在系统的UTF-16字符集中还是原来的中文。
类 Character
...
Unicode 字符表示形式
char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 因为UTF8是以8bits即1Bytes为编码的最基本单位的变长编码,中文一般在2到4byte
类 Character
...
Unicode 字符表示形式
char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 因为UTF8是以8bits即1Bytes为编码的最基本单位的变长编码,中文一般在2到4byte
defaultCharset
public static Charset defaultCharset()返回此 Java 虚拟机的默认 charset。
默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。
UTF-8中汉字是3字节,也有少量4字节。用了latin1后,信息已丢失,无法转回,中国两字符都分别对应一个字节 63 63
楼主你打印错了吧!