简析Unicode和UTF-8、UTF-16、UTF-32

本文介绍了Unicode字符编码标准及其与UTF-8、UTF-16、UTF-32的区别。Unicode旨在统一全球语言的字符编码,通过Unicode转义序列在编程中表示特殊字符。UTF是Unicode的转换格式,包括UTF-8(1-4字节编码)、UTF-16(2或4字节)和UTF-32(固定4字节)。

Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一种重要的交互和显示的通用字符编码标准,包括字符集、编码方案等。Unicode 是继 ASCII(美国国家交互信息标准编码)字符码后的一种新字符编码,Unicode 是为了解决传统的字符编码方案的局限而产生的,因此它覆盖了美国、欧洲、中东、非洲、印度、亚洲和太平洋的语言,以及古文和专业符号。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode 字符可以适用于所有已知的编码。Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。它为每一个符号定义一个数字和名称,并指定字符和它的数值(码位),以及该值的二进制位表示法,通过一个十六进制数字和前缀(U)定义一个16位的数值,如:U+0041 表示 A,其唯一的名称是 LATIN CAPITAL LETTER A。但请注意:JavaScript 1.3 之前的版本并不支持 Unicode 编码。

Unicode 转义序列
在字符直接量中使用 Unicode 转义序列,该转义序列由六个 ASCII 字符组成:\u 加上一个四个数值的十六进制数。如:\u00A9 表示版权符号。JavaScript 里的每一个 Unicode 转义序列由一个字符所对应解释。
下表是经常使用的特殊字符和它们的 Unicode 值。
类别 ----------------------- Unicode 值 名称 ------------------------ 格式名称
空白(whitespace ) ------- \u0009 --------------------------------- 制表符
---------------------------------- \u000B ------------------------------- 垂直制表符
---------------------------------- \u000C -------------------------------- 换页符
---------------------------------- \u0020 -------------------------------- 空格
行结束符值 ------------------- \u000A -------------------------------- 换行符
---------------------------------- \u000D ------------------------------- 回车符
其它Unicode 转义序列值 — \u000b ------------------------------- 退格符
----------------------------------- \u0009 ------------------------------ 水平制表符
----------------------------------- \u0022 ------------------------------ 双引号 "
----------------------------------- \u0027 ------------------------------ 单引号 ’
----------------------------------- \u005C ----------------------------- 反斜杠 /
在 Java 中,如果一个转义序列被用于一个单独的注释行,它将被解译为一个 Unicode 字符。对于一个字符串直接量,Java 编译器将首先解译转义序列。例如:如果在 Java 中使用一个换行符(\u000A),它将会终止该字符串,在 Java 中将导致一个错误,因为在字符串直接量中不允许换行,必须使用 \n 符。

UTF

UTF是“Unicode Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。

例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
1、char data_utf8[]={0xE6,0xB1,0x89,0xE5,0xAD,0x97};
---------------------------------------------------//UTF-8编码
2、char16_t data_utf16[]={0x6C49,0x5B57};
-------------------------------------------------- //UTF-16编码
3、char32_t data_utf32[]={0x00006C49,0x00005B57};
---------------------------------------------------//UTF-32编码
这里用char、char16_t、char32_t分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以char、char16_t、char32_t作为编码单位。(注: char16_t 和 char32_t 是 C++ 11 标准新增的关键字。如果你的编译器不支持 C++ 11 标准,请改用 unsigned short 和 unsigned long。)“汉字”的UTF-8编码需要3个字节。“汉字”的UTF-16编码需要两个char16_t,大小是2个字节。“汉字”的UTF-32编码需要两个char32_t,大小是4个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。

UTF-8

UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(十六进制) UTF-8 字节流(二进制)000000-00007F0xxxxxxx000080-0007FF110xxxxx 10xxxxxx000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx010000-10FFFF	11110xxx10xxxxxx10xxxxxx10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

UTF-16

UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U’=U-0x10000,然后将U’写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

UTF-32

UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。

字节序分为两种,分别是“大端”(Big Endian, BE)和“小端”(Little Endian, LE)。因此根据字节序的不同,UTF-16可被实现为UTF-16LE或UTF-16BE,UTF-32可被实现为UTF-32LE或UTF-32BE。例如:
在这里插入图片描述

unicode和UTF-8、UTF-16、UTF-32的区别

Unicode 是“字符集”;
UTF-8 、UTF-16、UTF-32是“编码规则”。
UTF-8用1-4个字节来保存unicode编码的字符。
UTF-16只能是选两字节或四字节来保存字符 。
UTF-32就是把所有的字符都用32bit也就是4个字节来表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值