Unicode详解

浅谈 filter伪协议的特性 对我来说,我以前对filter伪协议不甚了解,这次接触了这一题,就得主动去更加深入地了解一下filter伪协议了。以前呢就知道php//filter/read=convert.base64-encode/resource=[文件名]这干瘪瘪的一套,用就完了,现在看来深入了解是很有必要的。...... 阅读详情

原作者charlee、原始链接http://tech.idv2.com/2008/02/21/unicode-intro

 

最近一直在忙点私活,又好久没写blog了,再不写点的话二月份就又要以单篇文章结束了。前一阵子一直在研究Unicode,索性把研究结果介绍一下吧。

可能大家都听说过 Unicode、UCS-2、UTF-8 等等词汇,但它们具体是什么意思,是什么原理,之间有什么关系,恐怕就很少有人明白了。下面就分别介绍一下它们。

 


基本知识

介绍Unicode之前,首先要讲解一些基础知识。虽然跟Unicode没有直接的关系,但想弄明白Unicode,没这些还真不行。

字节和字符的区别

咦,字节和字符能有什么区别啊?不都是一样的吗?完全正确,但只是在古老的DOS时代。当Unicode出现后,字节和字符就不一样了。

字节(octet)是一个八位的存储单元,取值范围一定是0~255。而字符(character,或者word)为语言意义上的符号,范围就不一定了。例如在UCS-2中定义的字符范围为0~65535,它的一个字符占用两个字节。

Big Endian和Little Endian

上面提到了一个字符可能占用多个字节,那么这多个字节在计算机中如何存储呢?比如字符0xabcd,它的存储格式到底是 AB CD,还是 CD AB 呢?

实际上两者都有可能,并分别有不同的名字。如果存储为 AB CD,则称为Big Endian;如果存储为 CD AB,则称为Little Endian。

具体来说,以下这种存储格式为Big Endian,因为值(0xabcd)的高位(0xab)存储在前面:

地址值
0x00000000AB
0x00000001CD

相反,以下这种存储格式为Little Endian:

地址值
0x00000000CD
0x00000001AB

UCS-2和UCS-4

Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。

为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。

要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

UTF-16和UTF-32

UTF-16

UTF-16由RFC2781规定,它使用两个字节来表示一个代码点。

不难猜到,UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式直接保存下来。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。

UTF-16BE和UTF-16LE不难理解,而UTF-16就需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。BOM为U+FEFF这个字符。

其实BOM是个小聪明的想法。由于UCS-2没有定义U+FFFE,因此只要出现 FF FE 或者 FE FF 这样的字节序列,就可以认为它是U+FEFF,并且可以判断出是Big Endian还是Little Endian。

举个例子。“ABC”这三个字符用各种方式编码后的结果如下:

UTF-16BE00 41 00 42 00 43
UTF-16LE41 00 42 00 43 00
UTF-16(Big Endian)FE FF 00 41 00 42 00 43
UTF-16(Little Endian)FF FE 41 00 42 00 43 00
UTF-16(不带BOM)00 41 00 42 00 43

Windows平台下默认的Unicode编码为Little Endian的UTF-16(即上述的 FF FE 41 00 42 00 43 00)。你可以打开记事本,写上ABC,然后保存,再用二进制编辑器看看它的编码结果。

notepad-encode.png

另外,UTF-16还能表示一部分的UCS-4代码点——U+10000~U+10FFFF。表示算法比较复杂,简单说明如下:

  1. 从代码点U中减去0x10000,得到U'。这样U+10000~U+10FFFF就变成了 0x00000~0xFFFFF。
  2. 用20位二进制数表示U'。 U'=yyyyyyyyyyxxxxxxxxxx
  3. 将前10位和后10位用W1和W2表示,W1=110110yyyyyyyyyy,W2=110111xxxxxxxxxx,则 W1 = D800~DBFF,W2 = DC00~DFFF。

例如,U+12345表示为 D8 08 DF 45(UTF-16BE),或者08 D8 45 DF(UTF-16LE)。

但是由于这种算法的存在,造成UCS-2中的 U+D800~U+DFFF 变成了无定义的字符。

UTF-32

UTF-32用四个字节表示代码点,这样就可以完全表示UCS-4的所有代码点,而无需像UTF-16那样使用复杂的算法。与UTF-16类似,UTF-32也包括UTF-32、UTF-32BE、UTF-32LE三种编码,UTF-32也同样需要BOM字符。仅用'ABC'举例:

UTF-32BE00 00 00 41 00 00 00 42 00 00 00 43
UTF-32LE41 00 00 00 42 00 00 00 43 00 00 00
UTF-32(Big Endian)00 00 FE FF 00 00 00 41 00 00 00 42 00 00 00 43
UTF-32(Little Endian)FF FE 00 00 41 00 00 00 42 00 00 00 43 00 00 00
UTF-32(不带BOM)00 00 00 41 00 00 00 42 00 00 00 43

UTF-8

UTF-16和UTF-32的一个缺点就是它们固定使用两个或四个字节,这样在表示纯ASCII文件时会有很多00字节,造成浪费。而RFC3629定义的UTF-8则解决了这个问题。

UTF-8用1~4个字节来表示代码点。表示方式如下:

UCS-2 (UCS-4)位序列第一字节第二字节第三字节第四字节
U+0000 .. U+007F00000000-0xxxxxxx0xxxxxxx   
U+0080 .. U+07FF00000xxx-xxyyyyyy110xxxxx10yyyyyy  
U+0800 .. U+FFFFxxxxyyyy-yyzzzzzz1110xxxx10yyyyyy10zzzzzz 
U+10000..U+10FFFF00000000-000wwwxx-
xxxxyyyy-yyzzzzzzz
11110www10xxxxxx10yyyyyy10zzzzzz

可见,ASCII字符(U+0000~U+007F)部分完全使用一个字节,避免了存储空间的浪费。而且UTF-8不再需要BOM字节。

另外,从上表中可以看出,单字节编码的第一字节为[00-7F],双字节编码的第一字节为[C2-DF],三字节编码的第一字节为[E0-EF]。这样只要看到第一个字节的范围就可以知道编码的字节数。这样也可以大大简化算法。

ASCII、Base64、Unicode(UCS-2、UTF-8、Little endian、Big endian)编码总结 ASCII 一个字符(byte)有8个二进制位(bit),每一位都是0或1,最多表示256个符号 ASCII码一共规定了128个字符的编码,即第一位为0,后7位来表示这128个符号 包括32个不能打印出来的控制符号和键盘上的96个字符 绿色(52):26个英文字符的大小写格式 红色(44):每个按键都有两种符号,例如1和! 蓝色(2):空格和退格 Base64 把一串二进制转换成另一种二进制串 把每三个8Bit的字节转换为四个6Bit(38=46=24),然后把6Bit再添两位高位0,组成四个 阅读详情

相关推荐

中文化工具 LoveString

文本字符串编码在Text、ANSI、Unicode、Unicode Big Endian、UTF-8、 UTF-7 之间的互相转换,转换结果使用十六进制表示

win、py、notepad++的编码方式及问题

win、py、notepad++的编码方式及问题先说结论: 因为win的cmd默认使用的编码方式是gbk(ANSI) 所以遇到bat或者python中的中文需要在cmd中print显示时,如果出现乱码,首先需要检查是否因为不是 1. gbk编码的中文或2. 在代码中被转换为gbk编码或3. 在python代码中是unicode对象。 别在win下用自带的文本文档编辑器打开utf-8编码的文件并保存

一些有的没的 1万+

BMS短路测试避坑指南:从炸管到稳定,我是如何搞定MOS管和TVS的

本文详细记录了BMS短路测试中MOS管和TVS的优化过程,从驱动电阻调整、PCB寄生参数控制到TVS选配策略,提供了一套实用的调试方法论。通过实战案例解析,帮助工程师避免常见陷阱,实现稳定可靠的短路测试性能。

weixin_30652897的博客 140

Unicode Basic

转载:Unicode详解 2008-08-30 13:41 Unicode详解 版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/02/21/unicode-intro/以及本声明。 ...

weixin_30349597的博客 341

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

【程序化天空盒】过程记录01:日月 天空渐变 大气散射

在做一个仿照原神的天空盒,写文章作为技术总结和记录。

qq_41835314的博客 6741

unicode详解

unicode的中文翻译为统一码,也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准。简单的来看,unicode就是一个数字,每一个数字对应一个字符的编码,这个字符囊括了整个世界使用的全部语言和符号的字符,所以,从根本上来说,unicode就是一个映射表,一个从数字到文字的映射。

b1049112625的博客 2万+

SAP 人力资源工资配置项3---工资项配置

工资项设置

xiouluoyang的专栏 1万+

Unicode编码详解(一):Unicode简介及其分类

Unicode编码详解(一):Unicode简介及其分类 若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,网盘地址: https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg 本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇) 一、基本知识 1、Unicode Unicode又称为统一码、万国码、单一码,是国际组织制定的旨在容纳全球所有字符的编码方案,包括字符集、编码方案等,它为每种语言中的每个字符设定了统一且唯一的二

黄邦勇帅的博客 11万+

STM32G474片内运放实战:从独立模式到PGA与ADC采样链路

在嵌入式控制系统中,运放是连接模拟信号与数字处理的关键环节。传统方案依赖外部分立运放搭建放大电路,存在成本高、PCB布局敏感、一致性差等痛点。STM32G474在MCU内部集成多路可编程运放(OPAMP),支持独立模式、跟随器、PGA以及比较器模式,配合内部ADC和DMA可构成完整模拟采集链路。通过片内互联,信号路径大幅缩短,抗干扰性和通道一致性显著提升,尤其适用于电机电流采样、数字电源等场景。本文以STM32G474为例,详解从独立模式到PGA增益配置,再到ADC与DMA联动调试的完整过程,并给出采样时间

weixin_29194255的博客 246

二叉树随机漫步

元旦快乐! 学习到中本聪bitcoin的文章的calculation部分的时候,出现了binomial random walk,不是很明白什么是random walk。发现这个文章写的很好:https://blog.youkuaiyun.com/fireguard/article/details/16111603 随机漫步,也叫随机游走,最早是物理学中做"布朗运动"的微观粒子的运动形态来形成的一个模型,布朗运...

gjq5464的博客 1737

详解UNICODE

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。  Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也

【小试牛刀】 2803

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 870

Unicode详解zz

基本知识 字节和字符的区别 Big Endian和Little Endian UCS-2和UCS-4 UTF-16和UTF-32 UTF-16 UTF-32 UTF-8 基本知识 介绍Unicode之前,首先要讲解一些基础知识。虽然跟Unicode没有直接的关系, 但想弄明白Unicode,没这些还真不行。 字节和字符的区别 咦,字节和字符...

weixin_33674976的博客 747

手把手教你学Simulink——基于Simulink的Boost变换器电流模式控制(峰值电流控制)建模示例

本文详细介绍了基于Simulink的Boost变换器峰值电流模式控制建模方法。首先分析了Boost变换器在CCM模式下的工作原理及电流控制优势,重点阐述了斜坡补偿的必要性。通过分步指导搭建Simulink模型,包括主电路、电流采样、RS触发器和电压外环PI控制器等核心模块。仿真验证了系统在启动、负载突变和输入电压跌落等工况下的优异性能,输出电压稳定在48V±0.5V。文章还总结了工程实践要点,并提出了数字实现等扩展方向。该建模方法为电力电子高级控制策略的工程验证提供了有效途径。

MHD0815的博客 249

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unicode编码详解

Unicode定义: Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 ASCll码与Unicode编码不同 对于很多初学者来说,特别容易将这两个概念混淆,认为ASCLL码就是Unicod...

枫林晚的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python 中的unicode详解

通过例子来看问题是比较容易懂的。 首先来看,下面这个是我新建的一个txt文件,名字叫做ivan_utf8.txt,然后里面随便编辑了一些东西。 然后来用控制台打开这个文件,同样也是截图: 这里就是简单的打开文本,读取文本内容,打印出来看,我们看到print出来的是和我写进去的是一样的东西。然后呢,我在对这个内容使用decode(‘gbk’),就是解编...

dianbiao4727的博客 1341

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

详解UNICODE编码

UNICODE有多个字符集,其中最常用的是2字节字符集——UCS-2,即16个二进制,能表示0~65535共65536个字符,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,如0x7ECF转换成十进制 就是32463。目前中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分,其中中文仅取用了不到一万个常用字符。全部的中文字符在UCS-4中逐渐整理

u014279553的专栏 1541

Unicode、UTF-8编码详解

Unicode 编码

lixiangchibang的博客 2万+
上一篇: 我爱看电视
下一篇: sqlite3 安装和基本指令
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值