unicode编码详解,一看就懂

一、Unicode编码

1 UTF-8 -16 -32编码和Unicode编码

  Unicode编码是一种计算机字符编码标准,其实个人认为叫字符集更为准确;而我们熟悉的UTF-8 UTF-16 UTF-32是Unicode的具体实现(怎么存储在计算机)。

  1)Unicode编码规范制定标准:

   把世界上所有能出现的字符,都为其分配一个数字来表示,比如,数字U+7F57被分配给了汉字中的"罗"字。Unicode编码的标准里字符数量一直实在新增(包括一些稀有字符,当然emoji表情字符也属于unicode编码哈哈),19年3月刚发布了Unicode12.0版本,比之前的版本新增了一些字符,现在在标准中的字符一共有137929个,而Unicode编码目前规划了U+0000至U+10FFFF为unicode编码(以世界上字符的数量应该是很久不会考虑扩展的),算一下目前还剩下976183(1114112-137929)个代码点,这976183个代码点是规划在unicode中的数字,但是还没被分配对应的字符。

  2)UTF-8编码:

   UTF-8可以说是当前互联网最常用的编码格式了,它基于Unicode字符集进行编码设计。它最大的特点是变长字节的编码设计,一个字符最长4个字节,最少1个字节,大部分的中文字符占3个字节。

   编码规则如下:

  1.用一个字节表示的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。由于这128个字符的unicode完全对照ASCII码,可以说完全向下兼容ASCII码。即ASCII编码的文件可以用UTF-8打开而不乱码;

  2.用一个字节以上表示的字符,假设是N个字节表示这个字符:则该字符第一个字节的前N位都为1,第N+1位为0,剩下的N-1个字节的前两位都设为10,剩下没有主动设值的位置则使用这个字符的Unicode二进制代码点从低位到高位填充,不够用0补足。

   编码对照表如下:

 Unicode字符集范围(十六进制)  UTF-8编码(二进制)
 0000 0000 - 0000 007F  0xxxxxxx
 0000 0080 - 0000 07FF  110xxxxx 10xxxxxx
 0000 0800 - 0000 FFFF  1110xxxx 10xxxxxx 10xxxxxx
 0001 0000 - 0010 FFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

   结合编码规则和编码对照表,讲解汉字“罗”是如何编码和解码的:

   编码(encode): 字符“罗”所对应的unicode代码点由以上规则转化为UTF-8所对应的二进制数字,则称为编码。可以理解为使字符成为代码的意思,而解码就是代码成为字符。

   首先“罗”对应了unicode中的U+7F57,对应编码表中第三行,也就是用3个字节来表示的字符,把7F57的二进制111 1111 0101 0111?从低位对应补足到1110xxxx 10xxxxxx 10xxxxxx(从低位) 如下图所示:

   最后成为11100111 10111101 10010111即十六进制E7BD97。

   解码(decode): UTF-8所对应的二进制数字由以上规则转化为unicode码再对应到具体字符,则称为编码。

   如11100111 10111101 10010111这段二进制编码,第一个字节是111,对应编码对照表则这段编码表示的字符由3个字节组成,用1110xxxx 10xxxxxx 10xxxxxx规则剔除出x对应的数为111 1111 0101 0111,即7F57,该数字对应unicode字符集中的字符“罗”。

  3)UTF-32编码:

   同理和UTF-8基于unicode字符集。UTF-32编码为固定长度4个字节。因为unicode范围为00FFFF-10FFFF,4个字节表示的范围为00000000-FFFFFFFF,能直接表示所有unicode编码,不需要进行转换编码转换。以空间换时间。

  3)UTF-16编码:

   UTF-16以2或者4个字节编码表示unicode字符:

   unicode字符集中,000000-00FFFF表示的字符,在UTF-16中用2字节直接编码表示,不需要编码转换,这点和UTF-32一样(这里有点需要说明一下, U+D800 到 U+DFFF 是一个空段,即这些码点不对应任何字符,4字节需要用到)

   ?unicode字符集中,010000-10FFFF表示的字符,在UTF-16中用4字节编码表示,但是需要进行编码转换。比如010000-10FFFF中的某个字符X的uicode编码为AAAA AAAA AABB BBBB BBBB,分为高10位和低10位,高10位加上高位代理位D8(110110),低10位加上低位代理位DF(110111),即组成字符X的UTF-16编码110110AAAAAAAAAAA 110111BBBBBBBBBB。

二、java中的char类型

  java中char类型是2个字节长度,一个char在java中称作一个代码单元,而unicode的字符编码叫做代码点。

也就是说utf-16编码中的0000-FFFF的范围可以用一个char表示,10000-10FFFF就需要用两个char来表示。

原文地址:https://www.cnblogs.com/hahlzj/p/11908713.html

时间: 2024-10-09 16:01:45

unicode编码详解,一看就懂的相关文章

[转]各种字符集和编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了,在网上搜了搜,在书上翻了翻,总结一下吧.首先按照字符编码的历程来看: 1.  ASCII 我们需要了解的最早编码是ASCII码.它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来.如果你技艺高超,可以将该位用

[转] 从此不再惧怕URI编码:JavaScript及C# URI编码详解

混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Server.UrlEncode.Uri.EscapeUriString.Uri.EscapeDataString JavaScript中的还好,只提供了三个,C#中主要用的就有这么多,还没有列出其他编码(HTML),一多就弄不明白,弄不明白就心生恐惧,心生恐惧就变得苦逼,本文就向大家详细解释在JavaSc

Python字符编码详解(转)

1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号.不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础. 1.2. MBCS 然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求.后来每个语言就制定了一套自己的编码,由于单字节

Python 之路 Day02 -基础数据类型及编码详解

  基础篇 本章大纲: 字符编码和解释器编码详解 变量命名规则 基础数据类型(一) int 基础数据类型(二)  string 基础数据类型(三) bool 基础数据类型(四) list 基础数据类型(五) tuple 基础数据类型(六) dict 基础数据类型(七) set 补充可迭代对象的循环连接及enumerate输出 字符编码和解释器编码详解 一,编码的重要性: 1.1 文件编码和字符编辑编码及读取编码 #!/usr/bin/env python #-*- coding:utf-8 -*

【转】编码详解(下)

第二部分:JSP相关编码设置 2.1 JSP页面本身的编码形式 <%@ page language="java" import="java.util.*" pageEncoding="utf-8″%>pageEncoding 指的是jsp文件本身在本地保存时的编码方式.注意:在eclipse环境下会根据pageEncoding保存的. 2.2 服务器端发送字节流的编码 <%@ page contentType="text/htm

【转】编码详解(上)

第一部分:编码的种类 编码规范用于规定可见字符和控制字符的二进制表示形式,它分为多种类型:下面详细说说编码的方式: 1.1      ANSI编码 这种编码方式规定了英文占用了一个字节,中文占用两个字节(这个是我们通常所说的编码方式).因为汉字分为多个类型:有简体中文,有繁体中文,还有日语中的汉字.所以ANSI编码又分为:GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准. 1.2 ASCII编码 这是美国上世纪60年代制定的.ASCII码一共规定了128个字符的编码

第二讲:编码详解,防止中文乱码

编码详解 编码支持: ASCII编码:美国信息交换标准代码(American Standard Code for InformationInterchange,简称ASCII)是一种用于信息交换的美国标准代码,它的作用是给英文字母.数字.标点.字符转换成计算机能识别的二进制数规定了一个大家都认可并遵守的标准. GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换 GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码 ANSI是与你使用的w

mysql编码详解

在开发程序的时候,我们使用mysql数据库开发的时候,有时会碰到自己明明输入的是中文,为什么数据库中存储的就是???? 1.在配置Connection URL时,加上?useUnicode=true&characterEncoding=utf-8 2.编辑/etc/my.cnf 在[mysqld]下添加 default-character-set=utf8 在[client]下添加 default-character-set=utf8   可是这样做的原理是什么?为什么这样做就能解决问题那? 逐

字符编码详解及由来(UNICODE,UTF-8,GBK)

    一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS--是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's go!     很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".     再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样