【竞答】String.getBytes("Unicode")中,额外2个字节的来源

老紫竹 2008-10-09 09:14:34
加精
    String s = "1";
byte[] arr = s.getBytes("UNICODE");
System.out.println(Arrays.toString(arr)); // 12


请写出运行结果,并从源代码级解释原因。

JDK 为 6.0
...全文
4934 142 打赏 收藏 转发到动态 举报
写回复
用AI写文章
142 条回复
切换为时间正序
请发表友善的回复…
发表回复
东东不邪 2012-05-16
  • 打赏
  • 举报
回复
“UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAKSPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAKSPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BBBF开头的字节流,就知道这是UTF-8编码了。”
还是不明白,谁能为我解释一下上边这段话?
我的问题有两点:
1、前面说而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中,那后面又怎么能“如果收到FFFE,就表明这个字节流是Little-Endian的”收到它呢?
2、UTF-8也有BOM?
sunflowerxy 2010-12-15
  • 打赏
  • 举报
回复
mark~~ 谢谢分享
smile2010cool 2010-12-14
  • 打赏
  • 举报
回复
向高手们致敬……
lyn0032 2010-05-03
  • 打赏
  • 举报
回复
字符编码呀,一直很纠结
gukuitian 2009-10-16
  • 打赏
  • 举报
回复
mm
  • 打赏
  • 举报
回复
mark
East271536394 2008-10-20
  • 打赏
  • 举报
回复

为了在读取字节时能知道所采用的字节序,在传输时采用了一个名为
“ZERO WIDTH NON-BREAKING SPACE”(U+FEFF)的字符用于限定字节
序,开头两个字节为 FE FF 时为 Big-Endian,为 FF FE 时为 Little-Endian。
详见 RFC2781 3.2 节。

在 Java 中直接使用 Unicode 转码时会按照 UTF-16LE 的方式拆分,并加上 BOM。

如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。
woodAstone 2008-10-20
  • 打赏
  • 举报
回复
标记
骑驴的桑乔 2008-10-20
  • 打赏
  • 举报
回复
en,学习
renmms 2008-10-20
  • 打赏
  • 举报
回复
学习
一洽客服系统 2008-10-20
  • 打赏
  • 举报
回复
收藏~mark
wokan_woxihuan 2008-10-20
  • 打赏
  • 举报
回复
wokan_woxihuan 2008-10-20
  • 打赏
  • 举报
回复
if (Session["Userid"] == null)
{
Response.Write("<script>parent.document.location.href='Default.aspx';</script>");
}
else
{
this.TextBox1.Text=DAL.messageDAL.ExecuteScalarmanage(this.Session["userids"].ToString());
}
if(!Page.IsPostBack)
{
if(Session["DataBase"].ToString()!="")
{
this.Fill();
}
}
wokan_woxihuan 2008-10-20
  • 打赏
  • 举报
回复
showde123 2008-10-18
  • 打赏
  • 举报
回复
基本是 两位高手的 峰会。
又一块没接触过的东西。
chinagavin 2008-10-18
  • 打赏
  • 举报
回复
接分
laobaijia 2008-10-16
  • 打赏
  • 举报
回复
不行了 疯了疯了 看不下去了 不懂啊
jackwofe 2008-10-15
  • 打赏
  • 举报
回复
不知道
「已注销」 2008-10-15
  • 打赏
  • 举报
回复
学习了.........
cyberpeng 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 java2000_net 的回复:]
2个疑问,

1 为何UTF-8没有
2 我想知道,在源代码里的哪个部分做的这个判断。
[/Quote]

1,UTF-8没有是因为UTF-8得到的byte数组唯一,不需要判断高低字节的顺序。
2,这个……得到byte数组后,自己判断头两个字节不行么?
加载更多回复(118)

62,614

社区成员

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

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