需求:
将一个中文字符'中', 恢复成byte[2], 然后再将其合并为String类型, 要求输出一个"中".遇到如下问题: 组合byte[]到String,失败, 小弟才疏学浅,搞不定,所以特请教大牛:运行环境默认的编码是GB2312.
char src = 0x4e2d; //中文字'中'
System.out.println("原始字符:" + src);
byte high =(byte) (src>>8);
byte low = (byte)(src);
System.out.println("高字节:" + Integer.toHexString(high));
System.out.println("低字节:" + Integer.toHexString(low));
System.out.println(new String(new byte[]{(byte)high, (byte)low}, "GB2312"));请不要修改上面的思路, 请大家帮我彻底理清楚一下java的编码.
将一个中文字符'中', 恢复成byte[2], 然后再将其合并为String类型, 要求输出一个"中".遇到如下问题: 组合byte[]到String,失败, 小弟才疏学浅,搞不定,所以特请教大牛:运行环境默认的编码是GB2312.
char src = 0x4e2d; //中文字'中'
System.out.println("原始字符:" + src);
byte high =(byte) (src>>8);
byte low = (byte)(src);
System.out.println("高字节:" + Integer.toHexString(high));
System.out.println("低字节:" + Integer.toHexString(low));
System.out.println(new String(new byte[]{(byte)high, (byte)low}, "GB2312"));请不要修改上面的思路, 请大家帮我彻底理清楚一下java的编码.
这句就把src升到String类型了
String str = "中"; byte[] bt = str.getBytes("GB2312"); for (byte value : bt) {
// print byte value.
System.out.println(value);
}
System.out.println(new String(bt, "GB2312"));
new String(byte[],"gb2312");
char src = 0x4e2d; //中文字'中'
System.out.println("原始字符:" + src);
// 不处理编码
byte high = (byte) (src >> 8);
byte low = (byte) (src);
System.out.println("高字节:" + Integer.toHexString(high));
System.out.println("低字节:" + Integer.toHexString(low));
char c = (char) high;
c = (char) ((c << 8) + low);
// 不处理编码
System.out.println(new String(new char[]{c})); // 下面按"GB2312"处理
String s = new String(new char[]{src});
byte[] bb = s.getBytes("GB2312");
System.out.println("高字节:" + Integer.toHexString(bb[0]));//Integer.toHexString(int i)
System.out.println("低字节:" + Integer.toHexString(bb[1]));//自动转型为int
System.out.println("高字节:" + String.format("%x",bb[0]));//%x格式化为十六进制
System.out.println("高字节:" + String.format("%x",bb[1]));//%x格式化为十六进制
System.out.println(new String(bb, "GB2312"));
原始字符:中
高字节:4e
低字节:2d
中
高字节:ffffffd6
低字节:ffffffd0
高字节:d6
高字节:d0
中
成功生成(总时间:1 秒)
同学,你把char转化String, String得到的byte,再组合的,我要的是char组成的两个byte[]直接转化为String, 以此弄清楚编码规律,你这种方式已经偏离我的本意,不过很谢谢你! 等下给你加分, 期待高手中...
同学,你的想法已经错了,char本身是两个byte不错,可是char编码是UTF-16而且有部分字符需要int才行,就是两个代码点(两个char)。仔细看一下api吧
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)。
char src = 0x4e2d; //中文字'中'
System.out.println("原始字符:" + src);
byte high = (byte) (src >> 8);
byte low = (byte) (src);
System.out.println("高字节:" + Integer.toHexString(high));
System.out.println("低字节:" + Integer.toHexString(low));
// System.out.println(new String(new byte[]{(byte)high, (byte)low}, "GB2312"));
System.out.println(new String(new byte[]{high, low}, "UTF16"));
还用你的代码吧,只需要把GB2312改为UTF16
输出结果:
run:
原始字符:中
高字节:4e
低字节:2d
中
成功生成(总时间:0 秒)
you get it! 确实如此! 多谢兄弟!