Unicode编码详解

2023-11-03

Unicode定义:

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

ASCll码与Unicode编码不同

对于很多初学者来说,特别容易将这两个概念混淆,认为ASCLL码就是Unicode编码,这是明显错误的。
我们知道:1个byte=8bit,1个bit=1位二进制数,一位二进制数又可以用0或者1来表示。所以一个字节能表示最大的数字就是256。计算机是美国人发明的,而英文中涉及的编码并不多,一个字节可以表示所有字符了,所以ASCII(American national Standard Code for Information Interchange,美国国家标准信息交换码)编码就成为美国人的标准编码。ASCLL码虽然并须全面,但在所有字符集中,最知名的可能要数被称为ASCII的8位字符集了。

Unicode编码的由来:

我们都知道中文的字符肯定不止256个汉字,使用ASCII编码来处理中文显然是不够的,所以中国制定了GB2312编码,用两个字节表示一个汉字,碰到及其特殊的情况,还会用三个字节来表示一个汉字。GB2312还把ASCII包含进去了。同理,日文,韩文等上百个国家为了解决这个问题发展了一套自己的编码,于是乎标准越来越多,如果出现多种语言混合显示就一定会出现乱码。那么针对这种编码“乱象”,Unicode便应运而生了,其将所有语言统一到一套编码规则里。

Unicode编码的问题:

ASCII编码是1个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码是十进制的65,二进制的01000001;
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符’0’和整数0是不同的;
汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
正是由于这样的原因,使得Unicode编码一时间很难推广,于是,为了较好的解决 Unicode 的编码问题, UTF-8 和 UTF-16 应运而生。

UTF-8

UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。UTF-8 的编码规则很简单,只有二条:

(1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

(2)对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
编码规则如下
在这里插入图片描述

UTF-16

在了解 UTF-16 编码方式之前,先了解一下另外一个概念——“平面”。

在上面的介绍中,提到了 Unicode 是一本很厚的字典,她将全世界所有的字符定义在一个集合里。这么多的字符不是一次性定义的,而是分区定义。每个区可以存放 65536 个(2^16)字符,称为一个平面(plane)。目前,一共有 17 个(2^5)平面,也就是说,整个 Unicode 字符集的大小现在是 2^21。

最前面的 65536 个字符位,称为基本平面(简称 BMP ),它的码点范围是从 0 到 2^16-1,写成 16 进制就是从 U+0000 到 U+FFFF。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。剩下的字符都放在辅助平面(简称 SMP ),码点范围从 U+010000 到 U+10FFFF。

接下来我们再谈UTF-16,UTF-16编码采用了不同长度的编码表示所有的Unicode码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元;而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值一定落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)[U+D800–U+DBFF用于第一个代码单元,U+DC00–U+DFFF用于第二个代码单元]。这样设计十分巧妙,我们可以迅速地知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。

在Java中,char类型用UTF-16编码描述一个代码单元。所以在Java编程中强烈建议不要使用char类型,除非确实需要对UTF-16代码单元操作。最好将需要处理的字符串用抽象数据类型表示。

Unicode编码与文字处理

在文字处理方面,Unicode为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unicode编码详解 的相关文章

随机推荐

  • 2023HW-8月(10-15)53个0day,1day漏洞汇总含POC、EXP

    点击 仙网攻城狮 关注我们哦 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 2023HW 8月10 15号0day 1day漏洞汇总 已更新 包含以下漏洞需要自取 链接 https pan baidu com s 1Tr94yV
  • 使用OpenCV的OpenCL(ocl)模块

    参加OpenCV的OpenCL模块 以下称OCL 移植工作已经有2个月了 这里我说移植而不是开发 是因为大部分OCL模块的函数是从已经很成熟的GPU模块直接移植过来的 因此 目前阶段OCL模块所支持的函数接口是GPU模块的一个子集 但由于运
  • 变分推断(variational inference)

    大家对贝叶斯公式应该都很熟悉 P Z X p
  • C++调用OpenCV实现图像阈值处理

    1 前言 在计算机视觉技术中 阈值处理是一种非常重要的操作 它是很多高级算法的底层处理逻辑之一 比如在使用OpenCV检测图形时 通常要先对灰度图像进行阈值 二值化 处理 这样就得到了图像的大致轮廓 以便于识别图形 在阈值处理中 会将图像的
  • 配置NTP时间客户端

    NTP Network Time Protocol 是将计算机预指定服务器时间保持一致的服务 也就是让计算机时间同步的工具 前导知识 1 配置NTP服务前需要安装软件包chrony 2 NTP的系统服务 chronyd 3 NTP客户端配置
  • 构件与中间件技术

    文章目录 一 软件构件与中间构件 1 分布式软件的基本概念 2 软件构件的基本概念 3 中间件的基本概念 4 互操作的基本原理和实例 二 CORBA基本原理 1 对象管理体系结构 2 ORB结构 3 CORBA的优点和缺点 三 基于CORB
  • 【微信小程序】swiper的使用

    1 swiper的基本使用
  • error mysql提示SQLyog连接本地sql显示Can‘t connect to Mysql server on‘localhos‘

    在管理工具 服务 mysql 启动
  • 【计算机视觉】三种常用的分割数据集:室内场景(ADE20K)、室外场景(Cityscapes)和驾驶场景(BDD100K)

    文章目录 一 室内场景 ADE20K 1 1 背景介绍 1 2 数据集的介绍 二 驾驶场景 BDD100K 三 室外场景 Cityscapes 一 室内场景 ADE20K 1 1 背景介绍 ADE20K 数据集是 2016 年 MIT 开放
  • 使用VMware Workstation操作Linux系统提示Intel VT-x处于禁用状态

    问题 此主机支持Intel VT x 但Intel VT x处于禁用状态 以前没遇到过 其实跟我最近改过笔记本的bios有关 本机为联想拯救者笔记本 解决办法 1 进入bios显示如下 2 选择 Configuration 再选择 Inte
  • ubuntu下c++编译链接caffe的工程

    最近在做深度网络相关的项目 我们通常可以从github上download很多相关的源码 但是在我们的机子上编译的时候通常会遇到很多问题 将我最近踩的坑做了一些总结 希望对大家有所帮助 1 如果直接g cpp 出现下面或者是出现某种语法错误之
  • 五、多(一)对一和一对多查询

    1 查询所有账户 同时查询出账户所属的用户 包含用户的用户名和地址信息 实体类 public class User implements Serializable private Integer id private String user
  • 第3章(下)基于Softmax回归完成鸢尾花分类任务

    文章目录 3 3 实践 基于Softmax回归完成鸢尾花分类任务 3 3 1 数据处理 3 3 1 1 数据集介绍 3 3 1 2 数据清洗 3 3 1 3 数据读取 3 3 2 模型构建 3 3 3 模型训练 3 3 4 模型评价 3 3
  • 用c语言写一个自动售货机

    自动售货机 如图所示的简易自动售货机 物品架1 2上共有10样商品 按顺序进行编号 分别为1 10 同时标有价格与名称 一个编号对应一个可操作按钮 供选择商品使用 如果物架上的商品被用户买走 储物柜中会自动取出商品送到物架上 保证物品架上一
  • Oracle数据库还原数据基础知识

    还原数据在用户修改数据内容时创建 保存修改前的值 还原数据至少会保留到事务结束 便于rollback时使用 还原数据保证读取一致性 还原数据可用于闪回查询 查找过去某个时间点的数据 用于闪回表 将表恢复到特定时间点 还原表空间自动进行管理
  • Mybatis构建sql语法

    构建sql 之前通过注解开发时 相关 SQL 语句都是自己直接拼写的 一些关键字写起来比较麻烦 而且容易出错 MyBatis 给我们提供了 org apache ibatis jdbc SQL 功能类 专门用于构建 SQL 语句 常用方法
  • Mssql注入——dns注入,反弹注入

    DNS注入 DNS注入原理 通过子查询 将内容拼接到域名内 让load file 去访问共享文件 访问的域名被记录此时变为显错注入 将盲注变显错注入 读取远程共享文件 通过拼接出函数做查询 拼接到域名中 访问时将访问服务器 记录后查看日志
  • 新生代接口测试神器ApiFox总结,你真的会用吗?

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • linux启动生成文件,Linux重新生成启动引导文件

    1 重新生成grub2的配置文件 grub mkconfig o boot grub grub cfg 2 将grub2安装到硬盘引导扇区 grub install root directory dev sda 3 使用密码保护grub2
  • Unicode编码详解

    Unicode定义 Unicode 统一码 万国码 单一码 是计算机科学领域里的一项业界标准 包括字符集 编码方案等 Unicode 是为了解决传统的字符编码方案的局限而产生的 它为每种语言中的每个字符设定了统一并且唯一的二进制编码 以满足