帮忙解惑,100分相送

x-teamer团队 2010-06-10 12:28:14
需求:
将一个中文字符'中', 恢复成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的编码.
...全文
211 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lacus87 2010-06-10
  • 打赏
  • 举报
回复
4楼正解
new String(byte[],"gb2312");
dracularking 2010-06-10
  • 打赏
  • 举报
回复
unicode解码
Nature_2009 2010-06-10
  • 打赏
  • 举报
回复
整那么麻烦干什么。。。


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"));
kao331431214 2010-06-10
  • 打赏
  • 举报
回复
System.out.println("原始字符:" + src);
这句就把src升到String类型了
Java技术栈 2010-06-10
  • 打赏
  • 举报
回复
相互学习 这个得研究下
boluo520 2010-06-10
  • 打赏
  • 举报
回复
你可以参考一下截取字符串的代码
里面会有你要的答案
x-teamer团队 2010-06-10
  • 打赏
  • 举报
回复
围观和打酱油的, 给一分

给的答案比较模糊,不详细的2分.

其余的分给Niubility兄弟
x-teamer团队 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 natalya13 的回复:]

引用 14 楼 ostrichmyself 的回复:
引用 8 楼 natalya13 的回复:

// 下面按"GB2312"处理
String s = new String(new char[]{src});
byte[] bb = s.getBytes("GB2312");



同学,你把char转化String, String得到的byte,再组合的,

我要的是……
[/Quote]

you get it! 确实如此! 多谢兄弟!
dracularking 2010-06-10
  • 打赏
  • 举报
回复
哦,搞了半天,你0x4e2d就不是用GB2312编码的,怎么用它解码?
高亮 2010-06-10
  • 打赏
  • 举报
回复

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 秒)
wudi3111835 2010-06-10
  • 打赏
  • 举报
回复
这个。。。我是来打酱油的
  • 打赏
  • 举报
回复
围观,,顺便帮楼主顶一下
高亮 2010-06-10
  • 打赏
  • 举报
回复
String 本身也是UTF-16编码,有些字符需要两个char,

API节选:

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)。
高亮 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ostrichmyself 的回复:]
引用 8 楼 natalya13 的回复:

// 下面按"GB2312"处理
String s = new String(new char[]{src});
byte[] bb = s.getBytes("GB2312");



同学,你把char转化String, String得到的byte,再组合的,

我要的是char组成的两个byte[]直接转化为String, 以……
[/Quote]

同学,你的想法已经错了,char本身是两个byte不错,可是char编码是UTF-16而且有部分字符需要int才行,就是两个代码点(两个char)。仔细看一下api吧
x-teamer团队 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 natalya13 的回复:]

// 下面按"GB2312"处理
String s = new String(new char[]{src});
byte[] bb = s.getBytes("GB2312");

[/Quote]

同学,你把char转化String, String得到的byte,再组合的,

我要的是char组成的两个byte[]直接转化为String, 以此弄清楚编码规律,

你这种方式已经偏离我的本意,不过很谢谢你! 等下给你加分, 期待高手中...
QQ_370126238 2010-06-10
  • 打赏
  • 举报
回复
了解。。
dracularking 2010-06-10
  • 打赏
  • 举报
回复
用UTF-16、UTF16、UTF-16BE也都行
h541084989 2010-06-10
  • 打赏
  • 举报
回复
new String(byte[],"gb2312");
高亮 2010-06-10
  • 打赏
  • 举报
回复
不考虑编码,你的是正byte值,转十六进制没问题,按"GB2312"解码后是负值,所以会有ffffff
高亮 2010-06-10
  • 打赏
  • 举报
回复
run:
原始字符:中
高字节:4e
低字节:2d

高字节:ffffffd6
低字节:ffffffd0
高字节:d6
高字节:d0

成功生成(总时间:1 秒)
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧