- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
使用一个字节(8位),对128个字符进行编码; 。
最高位始终为0; 。
码数范围为 0000_0000(0x00) 到 0111_1111(0x7F) ; 。
使用两个字节(16位),对65536个字符进行编码; 。
范围为 0000_0000_0000_0000(0x0000) 到 1111_1111_1111_1111(0xFFFF) ; 。
而 0x0000 - 0x007F 对应的字符,与ASCII码保持一致; 。
由于世界上的字符,超过了65536个,所以开始只用两个字节的设计已经不足够了,需要扩展; 。
最终扩展如下:
基本多语言平面(BMP, Basic Multilingual Plane) 。
和开始的设计一致,用两个字节来编码,码数范围 0x0000 - 0xFFFF ; 。
但是,在这个范围里,有预留 0xD800 - 0xDFFF 的码数,他们不代表任何字符,仅用于作为增补平面的代理对而存在; 。
增补平面(SP, Supplementary Plane) 。
超出 BMP 所能表示的字符,改用如下范围: 0x10000 - 0x10FFFF 来编码; 。
Unicode编者认为这个范围已经足够全世界的字符编码了,因为这足够表示一百万多个字符了; 。
预留的 0xD800 - 0xDFFF ,分为两部分:
0xD800 - 0xDBFF
0xDC00 - 0xDFFF
这样做的目的,是为了UTF-16编码方式; 。
一个高位加一个低位,共四个字节,定义了SP中的字符的UTF-16编码; 。
Unicode编码中,一个字符所对应的码数,称为该字符的码点; 。
通常在计算机的字符和字符串中,使用 \u码点 的形式来转义码点,来表示一个Unicode编码的码点所对应的字符; 。
请注意,Unicode编码的码点,是人为约定的对字符的编码方式; 。
但是计算机只认二进制,所以如何将Unicode定义的字符的码点,编码为计算机实际存储的二进制串,以及如何从一串二进制串,解码成Unicode定义的字符的码点,就是 UTF-16 要做的事情; 。
UTF-16的16代表最小的编码单位是16位二进制串; 。
分为两种情况:
BMP中的字符 。
直接用Unicode定义的码点作为UTF-16编码即可; 。
SP中的字符 。
使用两个16位二进制串进行编码,即采用四个字节来编码; 。
现在假设有一个字符,其Unicode定义的码点为 0xAAAAA ,对其进行如下操作:
yyyy_yyyy_yyxx_xxxx_xxxx
; 1101_10yy_yyyy_yyyy 1101_11xx_xxxx_xxxx
; SP 的UTF-16编码的两个16位二进制串:
第一个16位串的前六位固定是 1101_10 ,结合 yy 的范围( 00 - 11 ),即 1101_1000 - 1101_1011 ,此范围即是代理对的高位的前两位 0xD8 - 0xDB ; 。
第二个16位串的前六位固定是 1101_11 ,结合 xx 的范围 00 - 11 ,即 1101_1100 - 1101_1111 ,此范围即是代理对的低位的前两位的范围 0xDC - 0xDF ; 。
再结合各自后面八位二进制串的范围 0000_0000 - 1111_1111 ,就可以得到各自完整的代理对; 。
也就是说, SP 的UTF-16的编码结果,即为高位+低位的四个字节的代理对; 。
只要看一个16位二进制串的头八位,是否在代理对的范围即可; 。
不在代理对的范围 。
说明是 BMP 中的字符,直接对应Unicode码点找到对应的字符即可; 。
在代理对的范围 。
说明是 SP 中的字符,再根据头六位确定好代理对的高低位, 。
去除各自的前六位,组成20位二进制串,再加上 0x10000 即为Unicode定义的码点,即可找到对应的字符; 。
UTF-8是不同于UTF-16的另一种对Unicode的编解码方式; 。
不同之处就在于,UTF-8的8代表最小的编码单位是8位二进制串; 。
UTF-8对码点的编码方式如下:
码点范围 0x0000 - 0x007F 。
UTF-8编码为二进制串 0xxx_xxxx ,与ASCII码保持一致,长度为1个字节; 。
码点范围 0x0080 - 0x07FF 。
UTF-8编码为二进制串 110x_xxxx 10xx_xxxx ,长度为2个字节; 。
码点范围 0x0800 - 0xFFFF 。
UTF-8编码为二进制串 1110_xxxx 10xx_xxxx 10xx_xxxx ,长度为3个字节; 。
码点范围 0x10000 - 0x10FFFF 。
UTF-8编码为二进制串 1111_0xxx 10xx_xxxx 10xx_xxxx 10xx_xxxx ,长度为4个字节; 。
假设现在有一个字符,码点在范围 0x0800 - 0xFFFF 中:
xxxx_yyyy yyzz_zzzz
; 1110_xxxx
; 10yy_yyyy
; 10zz_zzzz
; 只要看第一个字节的首位即可:
首位为0 。
说明在码点范围 0x0000 - 0x007F ,直接对应Unicode码点找到对应的字符即可; 。
首位为1,再看从首位开始,遇到第一个0结束,一共有几个1 。
不同的UTF编码,所对应的编码单位的长度不同; 。
UTF-16的编码单位的长度为16位二进制; 。
UTF-8的编码单位的长度为8位二进制; 。
这个编码单位称为代码单元; 。
比如对于UTF-16的编码:
在 BMP 中,一个字符所对应的UTF-16的16位二进制串,称为该字符的代码单元; 。
而在 SP 中,一个字符所对应的UTF-16的两个16位二进制串,称为该字符的一对代码单元; 。
而对于UTF-8的编码:
在码点范围 0x0000 - 0x007F 中,一个字符所对应的UTF-8的4个字节,称为该字符的4个代码单元; 。
在码点范围 0x0080 - 0x07FF 中,一个字符所对应的UTF-8的4个字节,称为该字符的4个代码单元; 。
在码点范围 0x0800 - 0xFFFF 中,一个字符所对应的UTF-8的4个字节,称为该字符的4个代码单元; 。
在码点范围 0x10000 - 0x10FFFF 中,一个字符所对应的UTF-8的4个字节,称为该字符的4个代码单元; 。
也就是说,随着UTF编码形式的不同,同一个字符的码点,会有不同个数的代码单元; 。
最后此篇关于字符编码:Unicode&UTF-16&UTF-8的文章就讲到这里了,如果你想了解更多关于字符编码:Unicode&UTF-16&UTF-8的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
我是一名优秀的程序员,十分优秀!