Java为什么使用UTF-16而不是更节省内存的UTF-8

Java使用UTF-16而不是更节省内存的UTF-8是因为UTF-16可以做到大部分常见的文字按2个字节存储,少量不常见的字符按4个字节存储,统计和定位字符的效率比UTF-8高。而UTF-8划分的变长空间多,这方面是个不能忽视的短板。

Java为什么使用UTF-16而不是更节省内存的UTF-8-Worktile社区

所谓UTF-8更节省内存的说法,对广大东亚文字来说根本就是伪命题。UTF-8更省内存只有在文本内绝大部分是ASCII的字符下才成立,也就是只需要一个字节即可表示一个字符,比如英文字母、数字、半角标点符号等。而东亚文字,比如常见的汉字,用UTF-8传输和存储则需要3个字节。相比之下,UTF-16对大部分常见文字只需要2个字节,不常见的文字才需要4个字节。谁更节省内存取决于内容,而不是编码本身。

 Java 当时选择了 UCS-2 与 Windows 一致,而 UCS-2 是定长编码。后来,BMP 已经不够表示 Unicode 了,UCS-2 无法表示,于是就有了 UCS-4,虽然 UCS-4 暂时可以保证定长,但 UCS-4 会显得过于浪费内存。于是,就回到了变长编码。

变长编码是用 UTF-8 还是 UTF-16?显然 UTF-8 有很多优势,因为 UTF-8 在7bit区域跟 ASCII 兼容,而 UTF-16 仅仅只在 BMP 区域与 UCS-2 兼容。

当初用 UCS-2 是因为它定长,而随着 Unicode 字符数量的暴增,UCS-2 无法定长,就变成了一个相对鸡肋的编码,为了保持兼容性只能继续存在。

UTF-16除了兼容UCS-2以外并无明显优势,毕竟UTF-16是变长编码。

来源:https://www.zhihu.com/question/308677093/answer/2748610506

https://www.zhihu.com/question/308677093/answer/2745757552

延伸阅读

UTF-8和UTF-16的区别

1、主要的UTF-8优点:

  • 基本的ASCII字符如数字,没有重音的拉丁字符等占用一个与US-ASCII表示相同的字节。 通过这种方式,所有US-ASCIIstring都变成了有效的UTF-8,在很多情况下它提供了不错的向后兼容性。
  • 没有空字节,它允许使用以空字符结尾的string,这也引入了大量的向后兼容性。
  • UTF-8与字节顺序无关,因此您不必担心Big Endian / Little Endian问题。

2、主要的UTF-8缺点:

  • 许多常见的字符长度不同,这会减慢编码点的索引,并可能会严重计算编码点数。
  • 即使字节顺序并不重要,但有时UTF-8仍然具有BOM(字节顺序标记),用于通知文本以UTF-8编码,并且即使文本只包含ASCII字符也不兼容ASCII软件。 微软软件(如记事本)特别喜欢把BOM添加到UTF-8。

3、主要的UTF-16优点:

  • BMP(基础多语言平面)字符,包括拉丁文,西里尔文,大多数中文(中华人民共和国支持强制性BMP以外的一些代码点),大多数日文可以用2个字节表示。 如果文本不包含补充字符,这将加快索引和计算代码点数。
  • 即使文本具有补充字符,它们仍由16位值对表示,这意味着总长度仍可被2整除,并允许使用16位char作为string的基本组成部分。

4、主UTF-16缺点:

  • 在US-ASCIIstring中有很多空字节,这意味着没有以空字符结尾的string和大量浪费的内存。
  • 在许多常见情况下(特别是在美国/欧盟/西里尔字母/以色列/阿拉伯国家/伊朗等国家),使用它作为固定长度编码“通常会起作用”,如果不这样做,通常会导致断开的支持。 这意味着程序员必须注意代理对,并在重要的情况下正确处理它们!
  • 它的长度是可变的,所以对码点进行计数或索引是很昂贵的,尽pipe比UTF-8less。

一般来说,UTF-16通常比内存表示更好,因为BE / LE在那里是不相关的(只是使用本地顺序),索引更快(只是不要忘记正确处理代理对)。 另一方面,UTF-8对于文本文件和networking协议是非常好的,因为不存在BE / LE问题,空终止常常派上用场,而且兼容ASCII。

文章标题:Java为什么使用UTF-16而不是更节省内存的UTF-8,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37293

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编认证作者
上一篇 2023年2月7日 下午5:12
下一篇 2023年2月7日 下午5:58

相关推荐

  • 并发和异步从概念上理解有什么区别

    区别是:并发在操作系统中指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。异步是一种通讯方式,对设备需求简单。我们的PC机提供的标准通信接口都是异步的。

    2023年2月13日
    76900
  • 项目前期如何跟进管理

    项目前期跟进管理是一项至关重要的任务,涉及对项目目标的明确、团队的组织、资源的分配、风险的评估以及沟通计划的建立。有效的前期管理是确保项目成功的关键、需要周密的计划和灵活的执行能力。 其中,项目计划的制定尤为重要,它是项目成功的基础。项目计划不仅包括具体的任务安排,还涵盖了预算、时间表、资源分配和风…

    2024年4月10日
    5800
  • devops有什么用

    DevOps具备提高软件交付速度、加强运维与开发的协作、增进自动化流程、提升产品质量和部署的可靠性这五个核心功能。在众多信息技术企业中,DevOps革命性的理念不断推进着开发与运营工作的紧密整合。依据当前的信息技术界与企业发展的趋势,DevOps在软件的持续交付与整个产品生命周期中的贡献显得尤为关键…

    2024年3月26日
    7700
  • 项目管理常见的方法有哪些

    项目管理常见的方法有:一、瀑布模型;二、敏捷模型;三、增量模型;四、融合模型。瀑布模型是传统的项目管理方法,也被称为“线性顺序模型”。在这个模型中,项目被分为一系列顺序阶段,每个阶段的工作必须在下一个阶段开始之前完成。 一、瀑布模型 瀑布模型是传统的项目管理方法,也被称为“线性顺序模型”。在这个模型…

    2023年4月30日
    37300
  • 如何说一个项目的管理优势

    项目管理的优势主要体现在提高效率、降低成本、增强沟通、管理风险和促进创新。其中,提高效率是项目管理最直观的优势,它通过合理分配资源、明确时间规划和优化工作流程,确保项目目标按时完成。这不仅可以帮助项目团队避免无谓的时间浪费,还能确保资源得到最大限度的利用。 一、提高效率 项目管理的根本目标是实现项目…

    2024年4月11日
    7000
  • devops的中文是什么

    开宗明义:DevOps,即开发运维,是一种强调软件开发人员(Dev)与信息技术运维人员(Ops)之间沟通合作的文化、运动或实践。该理念目的在于缩短系统开发生命周期,提供更高质量的发布。1、缩短开发周期,2、增加部署频率,3、更早地投入市场以及更高的产品质量。特别是缩短开发周期,通过促进开发与运维团队…

    2024年3月26日
    6900
  • oa是什么意思?

    OA代表办公自动化,是一个涉及硬件、软件及网络的综合系统,目的是使日常的办公活动更加高效和系统化。它通过数字化手段,自动化日常文书处理、信息传递和沟通协作等工作。办公自动化系统(OA),重点在于提高行政管理效率,降低文书工作的重复性。电子邮件系统、在线文档分享和编辑、会议排程、即时消息传递是常见的办…

    2024年1月11日
    50300
  • DevOps中的代码质量管理策略

    在DevOps实践中,代码质量管理为关键组成部分,涉及一系列措施,如自动化测试、代码审查、持续集成以及技术债务管理。1、自动化测试确保每次提交均经过严格校验,避免新错误。2、代码审查鼓励团队成员相互检查代码,提升软件的整体质量。3、持续集成(CI)允许开发者早期识别与解决问题,从而减少修复成本。4、…

    2024年1月4日
    25500
  • c语言中label作用是什么

    在 C 语言中,label 是一种标记符号,用于标识代码中的某个位置。它通常被用于控制程序流程,使得程序能够跳转到指定的位置执行代码。在本文中,我们将详细讲解 C 语言中 label 的作用。 什么是label? Label 是 C 语言中的一种标记符号,它可以被用于标识代码中的某个位置。在 C 语…

    2023年3月1日
    1.9K00
  • Java中的代码质量检查工具如何使用

    对于Java中的代码质量检查,有几种流行的工具在业内广泛应用,其中1、Checkstyle、2、PMD 和 3、FindBugs/SpotBugs 最为常见。这些工具可以帮助开发者遵守一定的代码规范,发现潜在的代码缺陷,提升代码的可维护性和稳定性。 Checkstyle 聚焦于确保代码遵循特定的风格…

    2024年1月8日
    40900

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部