`
shixiaomu
  • 浏览: 382834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Unicode和UTF-8

 
阅读更多
Unicode和UTF-8

为了统一全世界各国语言文字和专业领域符号(例如数学符号、乐谱符号)的编码,ISO制定了ISO 10646标准,也称为UCS(Universal Character Set)。UCS编码的长度是31位,可以表示231个字符。如果两个字符编码的高位相同,只有低16位不同,则它们属于一个平面(Plane),所以一个平面由216个字符组成。目前常用的大部分字符都位于第一个平面(编码范围是U-00000000~U-0000FFFD),称为BMP(Basic Multilingual Plane)或Plane 0,为了向后兼容,其中编号为0~256的字符和Latin-1相同。UCS编码通常用U-xxxxxxxx这种形式表示,而BMP的编码通常用U+xxxx这种形式表示,其中x是十六进制数字。在ISO制定UCS的同时,另一个由厂商联合组织也在着手制定这样的编码,称为Unicode,后来两家联手制定统一的编码,但各自发布各自的标准文档,所以UCS编码和Unicode码是相同的。

有了字符编码,另一个问题就是这样的编码在计算机中怎么表示。现在已经不可能用一个字节表示一个字符了,最直接的想法就是用四个字节表示一个字符,这种表示方法称为UCS-4或UTF-32,UTF是Unicode Transformation Format的缩写。一方面这样比较浪费存储空间,由于常用字符都集中在BMP,高位的两个字节通常是0,如果只用ASCII码或Latin-1,高位的三个字节都是0。另一种比较节省存储空间的办法是用两个字节表示一个字符,称为UCS-2或UTF-16,这样只能表示BMP中的字符,但BMP中有一些扩展字符,可以用两个这样的扩展字符表示其它平面的字符,称为Surrogate Pair。无论是UTF-32还是UTF-16都有一个更严重的问题是和C语言不兼容,在C语言中0字节表示字符串结尾,库函数strlen、strcpy等等都依赖于这一点,如果字符串用UTF-32存储,其中有很多0字节并不表示字符串结尾,这就乱套了。

UNIX之父Ken Thompson提出的UTF-8编码很好地解决了这些问题,现在得到广泛应用。UTF-8具有以下性质:

    编码为U+0000~U+007F的字符只占一个字节,就是0x00~0x7F,和ASCII码兼容。

    编码大于U+007F的字符用2~6个字节表示,每个字节的最高位都是1,而ASCII码的最高位都是0,因此非ASCII码字符的表示中不会出现ASCII码字节(也就不会出现0字节)。

    用于表示非ASCII码字符的多字节序列中,第一个字节的取值范围是0xC0~0xFD,根据它可以判断后面有多少个字节也属于当前字符的编码。后面每个字节的取值范围都是0x80~0xBF,见下面的详细说明。

    UCS定义的所有231个字符都可以用UTF-8编码表示出来。

    UTF-8编码最长6个字节,BMP字符的UTF-8编码最长三个字节。

    0xFE和0xFF这两个字节在UTF-8编码中不会出现。

具体来说,UTF-8编码有以下几种格式:

U-00000000 – U-0000007F:  0xxxxxxx
U-00000080 – U-000007FF:  110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

第一个字节要么最高位是0(ASCII字节),要么最高两位都是1,最高位之后1的个数决定后面有多少个字节也属于当前字符编码,例如111110xx,最高位之后还有四个1,表示后面有四个字节也属于当前字符的编码。后面每个字节的最高两位都是10,可以和第一个字节区分开。这样的设计有利于误码同步,例如在网络传输过程中丢失了几个字节,很容易判断当前字符是不完整的,也很容易找到下一个字符从哪里开始,结果顶多丢掉一两个字符,而不会导致后面的编码解释全部混乱了。上面的格式中标为x的位就是UCS编码,最后一种6字节的格式中x位有31个,可以表示31位的UCS编码,UTF-8就像一列火车,第一个字节是车头,后面每个字节是车厢,其中承载的货物是UCS编码。UTF-8规定承载的UCS编码以大端表示,也就是说第一个字节中的x是UCS编码的高位,后面字节中的x是UCS编码的低位。

例如U+00A9(©字符)的二进制是10101001,编码成UTF-8是11000010 10101001(0xC2 0xA9),但不能编码成11100000 10000010 10101001,UTF-8规定每个字符只能用尽可能少的字节来编码。
分享到:
评论

相关推荐

    ASCII Unicode 和UTF-8区别

    ASCII Unicode 和 UTF-8 的区别 ASCII 码是美国在 20 世纪 60 年代制定的字符编码标准,它规定了 128 个字符的编码,每个字符对应一个二进制代码,共占用一个字节的后 7 位,最前面的 1 位统一规定为 0。ASCII 码...

    UNICODE与UTF-8转换

    总结来说,UNICODE和UTF-8在字符编码领域各有其特点和优势,理解它们之间的关系和转换方法,对于进行跨语言的软件开发和数据处理至关重要。通过有效的转换,我们可以确保不同编码系统之间的文本数据能够正确无误地...

    字符编码笔记:ASCII,Unicode和UTF-8

    ### 字符编码笔记:ASCII,Unicode和UTF-8 #### 1. ASCII码 ASCII码是上个世纪60年代由美国制定的一套字符编码标准,用于规定英语字符与计算机内部二进制位之间的关系。在计算机内部,信息通常以二进制形式存在,...

    字符集Unicode与UTF-8之间的转换

    Unicode和UTF-8是两种常用的字符集和编码方式,本文将详细介绍它们之间的转换。 Unicode Unicode是一个字符集,提供了一个通用的字符编码方案,能够表示世界上所有语言中的所有字符。Unicode使用双字节表示每个...

    lvgl unicode 转 utf-8小工具

    lvgl unicode 转 utf-8小工具

    字符编码笔记:ASCII-Unicode和UTF-8

    字符编码笔记:ASCII、Unicode 和 UTF-8 本文主要介绍了字符编码的基本概念和历史发展过程,包括 ASCII 码、Unicode 和 UTF-8 的编码原理和特点。文章首先介绍了 ASCII 码的历史和编码原理,然后讨论了非 ASCII ...

    附录A.字符编码_3在LinuxC编程中使用Unicode和UTF-8[总结].pdf

    在Linux C编程中,字符编码主要涉及Unicode和UTF-8标准。Unicode是一个广泛采用的字符集,它包含世界上几乎所有的文字系统,而UTF-8是Unicode的一种编码方式,具有良好的向后兼容性和易于处理的特性。 UTF-8编码在...

    ASCII、Unicode和UTF-8.doc

    ASCII、Unicode和UTF-8是计算机世界中处理字符编码的三种重要标准,它们各自有着不同的历史背景和设计目的,对于理解和处理多语言文本至关重要。 首先,ASCII(American Standard Code for Information Interchange...

    ASCII、Unicode和UTF-8编码.docx

    字符编码是计算机处理文本的关键...总结来说,ASCII、Unicode和UTF-8编码分别代表了从基础的英文字符集到全球多语言字符集的演进,并通过UTF-8实现了一种高效且兼容的编码方式,使得现代计算机能够处理各种语言的文本。

    iOS 显示汉字的Unicode和UTF-8编码

    在iOS开发中,显示汉字涉及到了字符编码的重要概念,包括Unicode和UTF-8。这两个术语在计算机科学领域中是至关重要的,特别是在处理多语言文本时。让我们深入了解一下这两个概念及其在iOS中的应用。 首先,Unicode...

    字符编码笔记:ASCII,Unicode和UTF-8[参照].pdf

    字符编码笔记:ASCII, Unicode 和 UTF-8 本篇笔记主要介绍了字符编码的基础知识,包括 ASCII 码、Unicode 和 UTF-8 等概念。文章首先介绍了 ASCII 码的历史和原理,接着讨论了 Unicode 的提出和发展,最后解释了 ...

    文本文件编码转换:ANSI、Unicode、UTF-8相互转换(修改版)

    Unicode --> UTF-8 UTF-8 --> ANSI UTF-8 --> Unicode UTF-8 --> Unicode big endian ansi转别的,不检验BOM,一律作为ansi编码进行转换 unicode转别的,首先检验BOM,不合格不转换 utf8转别的,首先检验BOM,不...

    字符编码 ASCII,Unicode和UTF-8 介绍

    ### 字符编码:ASCII,Unicode和UTF-8 详解 #### ASCII编码:基础与限制 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是计算机领域中最早广泛使用的字符编码系统之一,它...

    国际化字符转码器 unicode 转 utf-8 utf-8 转 unicode

    unicode -> utf-8 utf-8 -> unicode 国际化必备工具

    StdioFile unicode-utf-8操作

    首先,我们需要了解Unicode和UTF-8的关系。Unicode是一个字符集,包含世界上几乎所有的文字系统,而UTF-8是Unicode的一种编码方式。在UTF-8编码中,每个字符可能由1到4个字节组成,根据字符的不同范围来确定字节数。...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    "CharsetConv"类提供了一个工具,帮助开发者在ANSI、Unicode(Little Endian和Big Endian)、UTF-8及UTF-8+BOM之间灵活转换,从而避免编码问题带来的困扰。通过深入学习和实践,开发者可以更好地应对各种编码挑战,...

    JS实现unicode和UTF-8之间的互相转换互转

    在JavaScript中,Unicode和UTF-8是两种常见的字符编码方式,它们之间存在转换的需求。Unicode是一种通用的字符编码标准,可以表示世界上几乎所有的字符。而UTF-8是Unicode的一种变体,它是一种可变长度的编码,根据...

    C++ 实现unicode到utf-8的转码

    Unicode是一种通用的字符集,它包含了世界上几乎所有的字符和符号,而UTF-8是Unicode的一种广泛使用的编码方式。 Unicode是一个标准化的编码系统,其目标是为所有已知的字符提供一个唯一的数字表示,称为码点(Code...

    gb2312,unicode,utf-8转换

    不同的字符编码标准有着各自的特点和应用范围,其中“GB2312”、“Unicode”和“UTF-8”是三种常见的编码格式,它们在中文环境下尤其重要。接下来,我们将深入探讨这三种编码格式及其相互转换。 **GB2312编码** GB...

    unicode、utf-8、ansi的故事及其相互转换.txt

    在探讨 Unicode、UTF-8 和 ANSI 编码之前,我们需要先了解几个基础概念。 **1. 字符编码(Character Encoding):** 字符编码是将人类可读的文字转化为计算机可以处理的数据的过程。在早期计算机系统中,不同的国家...

Global site tag (gtag.js) - Google Analytics