字符集与编码--代码点与代码单元

1. ASCII码

  统一规定英语字符与二进制位之间的关系。ASCII码一共规定了128个字符的编码。例如,空格“SPACE”是32(二进制00100000),大写字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号)只占用了一个字节的后面7位,最前面的1位统一规定为0。

2. Unicode

  世界上存在多种编码方式,同一个二进制数字可以被解释成不同的符号。之所以电子邮件经常出现乱码,是因为发信人和收信人使用的编码方式不一样。作为所有符号的编码,Unicode纳入了世界上所有的符号,给予每一个符号一个独一无二的编码。它是一个庞大的集合,可以容纳100多万个符号。例如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。具体的符号对应表,可以查询http://www.unicode.org/或者汉字对应表

  Unicode的问题:

  Unicode只是一个符号集,只规定了符号的二进制编码,但没有规定存储方式。例如,汉字严的Unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101)即需要2个字节。不同的符号需要的字节数量不同。存在如下2个问题:

  1 如何区别Unicode和ASCII?

  计算机怎么知道3个字节表示一个符号,而不是分别表示3个符号呢?

  2 容易出现空间浪费

  英文字母仅需一个字节。如果Unicode统一规定每个符号用3个或4个字节表示,那么存储英文字母时会出现2个或3个字节全是0,浪费空间。

  于是,出现了Unicode的多种实现方式,例如 UTF-8, UTF-16, UTF-32。

3. 码点(code point)

码点(code point)是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是字母A的码点。Unicode码点可以分成17个代码级别(code plane),每个代码级别可以用一个平面(Plane)表示,编号从 0 开始。

第一个平面即是 BMP(Basic Multilingual Plane 基本多语言平面),也叫 Plane 0,它的码点(code point)范围是 U+0000 ~ U+FFFF,这也是我们最常用的平面,其中包栝了经典的ASCII码,日常用到的字符绝大多数都落在这个平面内。其余的16个附加级别称为SP(Supplementary Planes增补平面),码点从U+10000到U+10FFFF,其中包栝了一些增补字符(supplementary character)。

4. 代码单元

参考:https://xiaogd.net/字符集与编码

代码单元是指一种转换格式(UTF)中最小的一个分隔,称为代码单元(code unit)。因此,一种转换格式只会包含整数个代码单元。

各种UTF编码方案下的代码单元:

1. UTF-8 的 8 指的就是最小为8bit一个单元,也即一字节为一个单元,UTF-8 可以包含一个单元,二个单元,三个单元,四个单元,对应即是一,二,三,四个字节。

2. UTF-16 的 16 指的就是最小为16bit一个单元,也即两字节为一个单元。UTF-16可以包含一个单元,二个单元,对应二,四个字节。我们操作UTF-16时就是以它的单元为基本单位的。

3. 同理,UTF-32 以 32bit 一个单元,它只包含这一个单元就够了,也即4个字节。

所以,现在我们清楚了:UTF-X 中的数字 X 就是各自代码单元的位数。

原文地址:https://www.cnblogs.com/lingxue3769/p/12214395.html

时间: 2024-10-03 03:50:11

字符集与编码--代码点与代码单元的相关文章

Java中代码点与代码单元(转)

摘要 本文介绍 Java 平台支持增补字符的方式.增补字符是 Unicode 标准中代码点超出 U+FFFF 的字符,因此它们无法在 Java 编程语言中描述为单个的 16 位实体(例如char数据类型).这些字符一般极少用,但是,有些会在诸如中文或日文人名中用到,因此,在东亚国家,政府应用程序通常会要求支持这些字符. Java 平台目前正在改进,以便支持对增补字符的处理,这种改进对现有的应用程序影响微乎其微.新的低层 API 在需要时能够使用单个的字符运行.不过,大多数文本处理 API 均使用

代码点,代码单元

引自:http://blog.csdn.net/weizhaozhe/article/details/3909079 摘要 本文介绍 Java 平台支持增补字符的方式.增补字符是 Unicode 标准中代码点超出 U+FFFF 的字符,因此它们无法在 Java 编程语言中描述为单个的 16 位实体(例如char数据类型).这些字符一般极少用,但是,有些会在诸如中文或日文人名中用到,因此,在东亚国家,政府应用程序通常会要求支持这些字符. Java 平台目前正在改进,以便支持对增补字符的处理,这种改

Unicode中的代码点和代码单元

Unicode标准的核心是一个编码字符集,它为每一个字符分配一个唯一数字.Unicode标准始终使用16进制数字,并且在书写时在前面加上U+,如字符“A”的编码为“U+0041”. 有个小技巧就是,在word中输入一个字符,然后按住alt+x就可以将该字符转为unicode显示. 代码点是指可用于编码字符集的数字.编码字符集定义一个有效的代码点范围,但是并不一定将字符分配给所有这些代码点.有效的Unicode代码点范围是U+0000至U+10FFFF.Unicode4.0将字符分配给一百多万个代

C# 字节流通过Base64编码转换成图片代码

C# 字节流通过Base64编码转换成图片代码 // 需载入以下的命名空间 // using System.IO; // using System.Drawing; // using System.Runtime.Serialization.Formatters.Binary; protected void Page_Load(object sender, EventArgs e) { byte[] buffer = ReadFile(Server.MapPath(@"\sex.txt"

base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互

直接上代码: #include <stdlib.h> #include <stdio.h> #include <getopt.h> #include <string.h> #include "base64.h" extern "C" { //Base64 编码 int Base64Encode(unsigned char *OrgString, unsigned char *Base64String, int OrgS

代码优化:Java编码技巧之高效代码50例

出处:  Java编码技巧之高效代码50例 1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值. 反例: Long i = new Long(1L);String s = new String("abc"); 正例: Long i = 1L;String s = "abc"; 1.2.当成员变量值无需改变时,尽量定义为静态常量 在类的每个对象实例中,每个成员变量都有一份副本,而成员静态常量

字符集与编码--Java string.length 与 char 类型

这篇博客用于记录学习字符编码过程中得到的结论,不做过多的理论讲述. 参考资料:字符集与编码(五) 1. char 类型 在Java中,char类型存放一个用UTF-16编码代码单元(16位)表示的字符,用于表示单个字符,通常用来表示字符常量.例如:'A'是编码为65所对应的字符常量. 与"A"不同,"A"是一个包含字符A的字符串.Unicode代码点可以表示为十六进制值,其范围从\u0000到\uFFFF.例如:\u2122表示注册符号,\u03C0表示希腊字母π.

字符集与编码01--charset vs encoding

声明:此文章转载自 http://my.oschina.net/goldenshaw/blog/304493 许多时候,字符集与编码这两个概念常被混为一谈,但两者是有差别的,作为深入理解的第一步,首先要明确: 字符集与字符集编码是两个不同层面的概念 charset是character set的简写,即字符集. encoding是charset encoding的简写,即字符集编码,简称编码. 与接口及接口实现的对比 可以把这两者与接口及接口实现做个对比: 从这里可以很清楚地看到, 编码是依赖于字

Oracle字符集、编码

Morven.Huang: C#, ORACLE, etc. ORACLE HANDBOOK系列之十:字符集.编码以及Oracle的那些事 第一部分字符集与编码常识 字符集: 人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集. 编码: 当前面收集的工作完成以后,为了让只认识数字的"愚蠢"的计算机也能够存储字符,人们不得不为集合里的每一个字符分配"身份证号码",这就是编码,从此,终于可以以存储编码的方式在计算机中存储字符了. 在字符集与编码世界的漫漫