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

相关推荐

  • 记录上班时间用什么软件好

    记录上班时间可以用:1. WorkTime;2. TimeCamp;3. Clockify;4. Toggl;5. RescueTime。WorkTime 是一个功能强大的上班时间记录软件,它可以记录您的上下班时间、休息时间和加班时间。它还提供了统计和分析功能,可以让您了解自己的工作时间分配情况,并…

    2023年2月28日
    21600
  • C/C++的头文件有什么缺点

    C和C++是广泛使用的编程语言,它们的头文件是编写程序的重要组成部分。虽然头文件提供了许多重要的函数和类定义,但也存在一些缺点。以下是C/C++头文件的缺点。 命名冲突 头文件中通常包含了许多函数和变量的定义,如果两个头文件中都定义了同名的函数或变量,那么在包含这两个头文件的程序中就会出现命名冲突的…

    2023年3月2日
    2700
  • lua调用函数时什么时候使用冒号,什么时候使用点号

    Lua中的函数调用是一种重要的编程概念,对于初学者来说,冒号和点号的使用可能会让人困惑。本文将详细讲解在Lua中何时使用冒号和何时使用点号进行函数调用。 冒号的使用 在Lua中,冒号通常用于对象的方法调用。对象方法是指使用“:”调用的函数,该函数的第一个参数是该对象本身。通常函数的第一个参数是对象本…

    2023年3月2日
    7000
  • 写java文档用什么软件

    写java文档用以下软件:一、Eclipse;二、MyEclipse;三、IntelliJ IDEA;四、NetBeans;五、BlueJ。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。 一、Eclipse…

    2023年4月29日
    900
  • ifix实时数据库有哪些

    ifix实时数据库有:1、ACCESS;2、FOXBASE;3、SQLSEVER;4、ORACLE。Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。 1、…

    2023年1月15日
    12200
  • 在哪些领域,C++ 还有着不可替代的优势

    C++最不可替代的地方就是在什么领域都能兼顾尽可能高的执行效率和还能接受的开发难度。C++与C语言完全兼容,C语言的绝大部分内容可以直接用于C++的程序设计,用C语言编写的程序可以不加修改地用于C++。 C++最不可替代的地方就是在什么领域都能兼顾尽可能高的执行效率和还能接受的开发难度。 与C语言的…

    2023年2月22日
    3300
  • Everything采用的索引数据库是什么

    Everything使用一种名为NTFS MFT(NTFS文件系统主文件表)的特殊索引数据库来快速查找文件和文件夹。NTFS是Windows操作系统中最常用的文件系统之一。它支持大型文件和分区,并具有使用权限、安全性和可靠性方面的改进。 Everything使用一种名为NTFS MFT(NTFS文件…

    2023年5月29日
    1000
  • project项目管理软件有什么用

    project项目管理软件的作用有:1、分解工作任务;2、设置各个活动之间的关系;3、自动生成进度计划;4、进行资源管理;5、进行分析汇报。分解工作任务是指,这种软件可以直接将一个大型项目分解为多个小活动。 一、分解工作任务 这种软件可以直接将一个大型项目分解为多个小活动,在分解完毕之后,企业就可以…

    2023年4月20日
    3000
  • 个人web开发asp.netcore和php7之间区别

    从学习曲线上来看,PHP明显比ASP.NET core要平滑易学,上手快,开发Web网站现成轮子多,开发效率高。http://ASP.NET core则不一样,它建构于.NET core平台之上,与整个.NET core技术群关联密切。 1、首先是运行效率上,ASP.NET Core 很快。因为 ….

    2023年2月9日
    7000
  • java 哪些数据类型初始化

    java 的数据类型初始化:1、boolean;2、char;3、byte;4、short;5、int;6、long;7、float;8、double。其中, boolean布尔类型的初始化数据类型是false。 1、boolean boolean的初始化数据类型是false。 boolean 数据…

    2023年1月3日
    10800

发表回复

登录后才能评论
联系我们
站长微信
站长微信
分享本页
返回顶部