【竞答】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
...全文
5703 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)
内容概要:本文研究了一种应用于太阳能发电系统的多级逆变器,旨在通过采用正弦脉宽调制(SPWM)技术有效降低输出电压的总谐波失真(THD),从而提升电能质量。研究基于Simulink平台构建了完整的仿真模型,系统地实现了SPWM信号生成、驱动逻辑控制以及多电平输出波形合成等关键环节,验证了该多级逆变器在不同运行工况下具备优异的动态响应能力和稳定性。仿真结果表明,所设计的逆变器能够输出接近理想正弦波的电压波形,显著抑制高次谐波,满足可再生能源并网对电能质量的严苛要求,体现出多级逆变拓扑在光伏发电系统的技术先进性与工程应用价值。; 适合人群:电气工程、自动化、新能源科学与工程及相关专业的本科生、研究生,以及从事光伏逆变器设计、电力电子变换技术和可再生能源并网系统研发的工程技术人员。; 使用场景及目标:①深入理解多级逆变器的工作原理及其在太阳能发电系统的关键作用;②掌握SPWM调制技术的理论基础与实现方法,并分析其对改善THD的核心机制;③借助Simulink仿真平台开展电力电子电路的建模、参数调试与性能评估,服务于课程设计、毕业设计、科研课题或实际工程项目开发。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作与验证,细致调整调制比、载波频率等关键参数,观察其对输出波形和THD指标的影响,以深化对系统动态特性的理解,并尝试优化控制策略以进一步提升系统性能。
VCF 生成器 Lite v6.0.0:批量导入与功能拓展 VCF 生成器 Lite v6.0.0 正式版已发布,此次更新带来了批量导入手机通讯录这一重要功能,极大地方便了用户整理和管理联系人信息。同时,新增了多项功能,如翻译所有 CLI 内容,让不同语言背景的用户都能更好地使用;verbose 模式新增更多日志信息,有助于用户更详细地了解操作过程。 此外,还添加了多地区号码格式支持,包括国港澳台地区电话号码格式,满足了不同地区用户的需求。当未捕获异常时,系统会自动保存错误日志,并引导用户反馈给开发者,这体现了产品团队对用户体验 的重视,有助于及时发现和解决问题。 修复痛点:引号清理与进度条显示问题 在修复方面,此次更新解决了引号清理功能在包含换行符时的错误行为,以及自 `v4.3.0` 版本以来的进度条显示问题。这些问题虽然看似微小,但却影响了用户的使用体验,修复后能让用户更加顺畅地使用 VCF 生成器 Lite。 代码与文档重构:提升可维护性与易用性 在变更方面,将翻译框架迁移到 gettext,提升了 `LANGUAGE` 环境变量 优先级,方便用户根据自己的语言偏好进行设置。在 AI 的指导下重构项目,使得各层次职责更加清晰,代码更加模块化,可维护性更高,这为产品的后续发展奠定了良好的基础。 同时,按 Diataxis 框架重构用户文档,按开发生命周期 重组开发者文档,让用户和开发者都能更方便地获取所需信息,提高了产品的易用性。 编辑观点:VCF 生成器 Lite v6.0.0 的更新在功能、修复和代码文档方面都有显著提升,满足了用户的实际需求,增强了产品的竞争力,未来有望在市场上取得更好的成绩。

62,621

社区成员

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

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