编码规则UTF-8 和 UTF-16的区别

UTF-8 和 UTF-16 的设计背景与历史

为了更好地理解 UTF-8 和 UTF-16 的设计选择和背景,以下是两种编码方案的历史、设计动机和它们在计算机科学中的应用。

Unicode 的背景

在 Unicode 之前,不同的字符集和编码方案使得跨平台和国际化的文本处理变得复杂且难以维护。例如,ASCII 只能表示 128 个字符,无法满足处理全球所有文字的需求。不同的语言和地区有各自的编码方案,导致了“乱码”和“代码页地狱”等问题。

为了统一全球文字的编码,Unicode 联盟于 1991 年发布了 Unicode 标准,旨在为每一个字符分配唯一的编码点,并定义了一套通用的字符编码体系。

UTF-8 的设计背景与历史

设计背景
  1. 目标: 为了有效地编码所有 Unicode 字符,同时保持对 ASCII 的完全兼容。
  2. 网络友好: 需要一种适合于文件和网络传输的编码方案,因为许多互联网协议(如 HTTP 和 SMTP)基于 ASCII。
  3. 可变长度: 能够紧凑地表示不同语言的字符,尤其是对于占主导地位的英语字符集,应该高效。
  4. 逐字节处理: 允许通过单字节处理机制进行解码,这对于流媒体和网络数据包的处理特别重要。
历史
  • 发明时间: UTF-8 于 1992 年由 Ken Thompson 和 Rob Pike 在贝尔实验室发明。
  • 发表: 1993 年,UTF-8 被正式提出,并且在 RFC 2277 中定义为“用于所有文本 MIME 内容的标准格式”。
  • 采用: 随着互联网的发展,UTF-8 被广泛采用,尤其在 web 技术和电子邮件传输中。
设计特色
  1. ASCII 兼容性: UTF-8 使用 1 字节来编码 ASCII 字符,这使得它可以与现有的基于 ASCII 的系统无缝集成。
  2. 无 BOM 影响: UTF-8 不需要字节序标记(BOM),因为其字节顺序在所有平台上都是一致的。
  3. 同步性: UTF-8 字符串可以通过前缀字节的模式确定下一个字符的起点,这使得它对流式处理特别有利。

UTF-16 的设计背景与历史

设计背景
  1. 目标: 提供一种比 UTF-8 更高效的 Unicode 编码,特别是针对 BMP(基本多文种平面)字符的高效处理。
  2. 固定长度(对于 BMP): 对于 BMP 字符,每个字符使用固定的 2 个字节,便于快速索引和处理。
  3. 代理对支持: 能够表示超出 BMP 范围的字符,这对于扩展 Unicode 范围至超过 65536 个字符是必要的。
历史
  • 发明时间: UTF-16 于 1993 年由 Unicode 联盟发布,是 Unicode 标准的一部分。
  • 发展: UTF-16 的前身是 UCS-2,它是一种固定长度的 16 位编码,但只能编码 BMP 范围内的字符。随着 Unicode 的扩展,UTF-16 引入了代理对以支持更多的字符。
  • 应用: UTF-16 被广泛用于操作系统和编程语言的内部表示,如 Windows 的内部字符串表示和 Java 的字符存储。
设计特色
  1. 固定长度处理: 对于大多数常用字符,UTF-16 提供了 2 字节的固定长度,这简化了许多字符处理操作。
  2. 高效的东亚语言处理: UTF-16 对于东亚文字(如汉字)更为高效,因为这些文字大部分位于 BMP 范围内。
  3. 代理对机制: 通过使用代理对,UTF-16 可以编码超过 65536 个字符,这对于全面支持 Unicode 的所有字符是必需的。

设计动机和应用场景

  1. UTF-8 的设计动机:

    • 兼容性: UTF-8 保持了与 ASCII 的兼容性,这使得它成为互联网上的事实标准。
    • 灵活性和效率: UTF-8 能够高效地编码 ASCII 字符(1 字节),并且相对高效地编码其他字符(多字节),这使得它在以英文为主的环境中非常高效。
    • 无字节序问题: 由于每个字节在 UTF-8 中都有固定的位置,避免了字节序的问题。
    • 简化传输和存储: UTF-8 的逐字节处理特点使得它在流媒体、文件传输和文本存储中极具优势。
  2. UTF-16 的设计动机:

    • 字符集扩展: UTF-16 的设计初衷是为了有效地表示扩展的 Unicode 字符集,尤其是当 Unicode 范围超出 BMP 后。
    • 高效处理 BMP 字符: 大多数常用字符(特别是东亚语言)位于 BMP 范围内,因此 UTF-16 可以以 2 字节的固定长度编码这些字符,这对于这些语言的文本处理是高效的。
    • 内部使用和处理: 许多操作系统和编程语言(如 Windows 和 Java)选择 UTF-16 作为内部字符表示形式,因其对 BMP 字符的高效处理。

编码机制

  1. UTF-8:

    • 可变长度编码: UTF-8 使用 1 到 4 个字节来编码 Unicode 字符。
      • 1 字节: 0xxxxxxx(适用于 ASCII 范围的字符,0x00 - 0x7F)。
      • 2 字节: 110xxxxx 10xxxxxx
      • 3 字节: 1110xxxx 10xxxxxx 10xxxxxx
      • 4 字节: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    • 字节顺序一致: UTF-8 不受字节序影响,即大端序(Big-endian)和小端序(Little-endian)都一样。
    • ASCII 兼容: UTF-8 对于 0x00 到 0x7F 的 ASCII 字符使用单字节编码,与 ASCII 完全兼容。
  2. UTF-16:

    • 可变长度编码: UTF-16 使用 2 个或 4 个字节来编码 Unicode 字符。
      • 基本平面(BMP,0x0000 - 0xFFFF)的字符使用 2 个字节。
      • 辅助平面(0x10000 - 0x10FFFF)的字符使用 4 个字节(一个高位代理和一个低位代理)。
    • 字节顺序影响: UTF-16 可以是大端序或小端序,通常通过字节序标记(BOM,Byte Order Mark,0xFEFF)来指示。

存储效率

  1. UTF-8:

    • 对于 ASCII 范围的字符(0x00 - 0x7F),UTF-8 使用 1 个字节,存储非常高效。
    • 对于非 ASCII 字符,尤其是汉字等需要 3 个字节,这时存储效率较低。
    • 对于补充字符(大于 0xFFFF),使用 4 个字节。
  2. UTF-16:

    • 对于大多数常用字符(BMP 范围内,0x0000 - 0xFFFF),UTF-16 使用 2 个字节。
    • 对于超出 BMP 的字符(0x10000 及以上),UTF-16 使用 4 个字节。
    • 在以英文为主的文本中,UTF-16 的存储效率较低,但对于东亚文字较高效。

编码特性

  1. UTF-8:

    • 前向兼容: UTF-8 编码具有前缀的特性,每个字节的高位可以指示字节序列的长度,这样扫描字符时可以确定下一个字符的起始位置。
    • 同步容错: 如果遇到无效的字节序列,可以跳过错误部分并继续解码后续部分,不影响整体的解码。
    • 按字节处理: 可以逐字节处理,非常适合流媒体和网络传输。
  2. UTF-16:

    • 固定长度(对于 BMP 字符): 对于 BMP 范围内的字符,每个字符使用 2 个字节,便于快速索引和字符计数。
    • 复杂的代理对: 对于补充字符,需要代理对(surrogate pairs),编码和解码较为复杂。
    • 适合大字符集: 在需要处理大量非 ASCII 字符的情况下,UTF-16 更高效。

兼容性和应用场景

  1. UTF-8:

    • 广泛应用于网络传输和文件存储中,尤其适合以英文和数字为主的场景。
    • 常用于互联网标准,如 HTML 和 JSON,因其对 ASCII 的良好兼容性。
  2. UTF-16:

    • 常用于操作系统和编程语言内部,如 Windows 的内部 API 和 Java 的字符串表示。
    • 适合处理大量非 ASCII 字符的应用,如东亚文字处理。

总结

  • UTF-8: 以可变长度编码字符,具有较好的 ASCII 兼容性和网络传输效率,非常适合以英语为主的文本处理和互联网应用。目前UTF-8快要在互联网一统江湖了
  • UTF-16: 适合需要处理大量非 ASCII 字符的场景,虽然占用存储空间较大,但在处理字符时较为高效,适合在内存中存储文本和内部字符处理。

图示比较

  1. UTF-8 编码示例:

    • 字符 'A' (U+0041): 0x41 → 01000001 (1 字节)
    • 字符 '中' (U+4E2D): 0x4E2D → 11100100 10111010 10101101 (3 字节)
    • 字符 '𐍈' (U+10348): 0x10348 → 11110000 10010000 10001101 10001000 (4 字节)
  2. UTF-16 编码示例:

    • 字符 'A' (U+0041): 00000000 01000001 (2 字节)
    • 字符 '中' (U+4E2D): 01001110 00101101 (2 字节)
    • 字符 '𐍈' (U+10348): 11011000 00000011 11011100 00101000 (4 字节,代理对)

通过以上的对比,可以清楚地看到 UTF-8 和 UTF-16 在编码方式、存储效率和适用场景上的差异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年AI+游戏赛道的公司和工具归类总结

随着人工智能技术的飞速发展,AI在游戏开发领域的应用越来越广泛。以下是对2024年AI+游戏赛道的公司和工具的归类总结,涵盖了从角色和场景设计到音频制作,再到动作捕捉和动画生成等多个方面。 2D与3D创作 2D创作工具:专注于角色和场景的平面设计,提供AI辅助的图案生成和风…

【2024德国工作】外国人在德国找工作是什么体验?

挺难的,德语应该是所有中国人的难点。大部分中国人进德国公司要么是做中国业务相关,要么是做技术领域的工程师。先讲讲人在中国怎么找德国的工作,顺便延申下,德国工作的真实体验,最后聊聊在今年的德国工作签证申请条件…

【八股系列】说一下mobx和redux有什么区别?(React)

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【介绍React高阶组件,适用于什么场景?】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评…

双例集合(二)——双例集合的实现类之HashMap容器类

双例集合的常用实现类有HashMap和TreeMap两个,通过这两个类我们可以实现Map接口定义的容器,一般情况下使用HashMap容器类较多。 HashMap容器类是Map接口最常用的实现类,它的底层采用Hash算法来实现,这也就满足了键key不能重复的要…

揭秘!速卖通、敦煌网、国际站出单背后的黑科技:自养号测评技术

在竞争激烈的跨境电商平台上,如亚马逊、速卖通、Lazada、Shopee、敦煌网、Temu、Shein、美客多和阿里国际等,稳定出单成为每位卖家共同追求的目标。为了实现这一目标,卖家需要从产品选择、运营策略和客户服务等多个维度进行全面考量&#xff…

华为重磅官宣:超9亿台、5000个头部应用已加入鸿蒙生态!人形机器人现身 专注AI芯片!英伟达挑战者Cerebras要上市了

内容提要 华为表示,盘古大模型5.0加持,小艺能力全新升级。小艺智能体与导航条融为一体,无处不在,随时召唤。只需将文字、图片、文档“投喂”小艺,即可便捷高效处理文字、识别图像、分析文档。 正文 据华为终端官方微…

JavaWeb阶段学习知识点(一)

【参考视频】https://www.bilibili.com/video/BV1m84y1w7Tb?p=167&vd_source=38a16daddd38b4b4d4536e9c389e197f SpringBoot项目的创建和接口配置 做一个springboot项目,从创建项目到实现浏览器访问localhost:8080/hello返回字符串hello world的全流程 1. 创建项目 idea新…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品:2组55寸OLED柔性屏2x1 特点:嵌入墙体,与空间装饰融入一体 用途:播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点,一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

芯片验证分享系列总结及PPT分享

大家好,我是谷公子。花了将近两个月时间,《芯片验证分享》这一系列视频分享已经更新完了,内容涵盖了名词解释、芯片验证原则、激励开发、代码审查以及芯片调试。这一系列视频主要侧重于芯片验证理论的分享,希望可以帮助大家构建芯…

wvp-GB28181-pro 源码分析-点播流程(三)

文章目录 一 、28181-2016标准文档中的点播流程二 、点播流程源码分析2.1 页面发起点播请求2.2 与ZLM协商SSRC信息2.3 订阅zlmediakit的hook消息及发送invite信令2.4 处理invite信令响应并应答2.5 收到ZLM的推流通知2.6 播放成功2.7 停止点播流程2024年6月20日下载的wvp-GB2818…

程序员·职场效能必修宝典㊿:正视自己的职业倦怠

> 【易编橙终身成长社群,相遇已是上上签!】- 点击跳转~ < 作者:哈哥撩编程 (视频号同名) 图书作者:程序员职场效能宝典 博客专家:全国博客之星第四名 超级个体:COC上海社区主理人 特约讲师:谷歌亚马逊分享嘉宾

VBA语言専攻T3学员领取资料通知

各位学员∶本周MF系列VBA技术资料增加631-635讲&#xff0c;T3学员看到通知后请免费领取,领取时间6月21日晚上19:00-6月22日晚上20:00。本次增加内容&#xff1a; MF631:提取某列数据的唯一值 MF632:自动调整文本并旋转到90度 MF633:仅复制格式 MF634:Mod运算判断奇数偶数 …

又发现一款独立清理神器,界面清爽,功能强大,没有广告!

360清理Pro独立提取版是360公司推出的一款清理软件&#xff0c;主要用于清理系统垃圾和优化系统性能&#xff0c;涵盖了四大类型的清理场景&#xff0c;分别为&#xff1a;微信、QQ的垃圾扫描及清理&#xff0c;系统盘中的大文件、重复文件扫描及清理以及系统软件使用痕迹的清理…

毕业答辩制作PPT【攻略】

毕业答辩制作PPT【攻略】 前言版权毕业答辩制作PPT【攻略】一、WPS AI 15天免费会员二、AI文档生成PPT三、修改完善PPT 最后 前言 2024-06-14 23:43:05 以下内容源自《【攻略】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN…

fast lio 运行mid360采集的数据,并保存每一帧的点云PCD和位姿

首先我们看到在map_incremental中存在一个保存每一帧PCD文件的代码&#xff0c;因此想利用改代码。 如何修改呢&#xff1f; 一. 改每一帧无畸变点云的PCD的保存代码 /**************** save map ****************//* 1. make sure you have enough memories/* 2. noted that…

数字化物资管理系统的未来:RFID技术的创新应用

在信息化和智能化不断发展的背景下&#xff0c;物资管理系统的数字化转型已成为各行各业关注的焦点。RFID技术作为一种先进的物联网技术&#xff0c;通过全面数字化实现物资信息的实时追踪和高效管理&#xff0c;为企业的物资管理提供了强有力的支持。 首先&#xff0c;RFID技…

linux中DNS域名解析服务(后续补充)

分离解析简介&#xff1a; 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。 实验要求&#xff1a;防火墙要么关…

如何基于项目人力和管线方案选择FGUI和UGUI

1&#xff09;如何基于项目人力和管线方案选择FGUI和UGUI 2&#xff09;TMP字体出包丢失字体描边 3&#xff09;如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4&#xff09;为什么我的水这么干净&#xff0c;和UE教程里的有差别 这是第390篇UWA技术知识分享的…

Javase.认识异常

认识异常 【本章目标】1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.2 try-catch捕获并处理2.3.3 finally2.4 异常的处理流程 3. 自定义异常类 【本章目标】 异常概念与体系结构异常的…

技术实践:基于百数低代码平台的学生档案管理系统搭建

在数字化时代&#xff0c;信息技术的应用已经渗透到社会的各个角落&#xff0c;教育领域也不例外。学生档案管理作为学校日常运作的重要一环&#xff0c;其信息化、智能化的需求日益凸显。特别是在拥有多个校区的大型学校中&#xff0c;如何高效、准确地管理学生档案&#xff0…