`

UTF-8、UTF-16、UTF-32

阅读更多

Unicode 是Unicode.org制定的编码标准,目前得到了绝大部分系统和编程语言的支持。Unicode.org官方对 Unicode的定义是:Unicode provides a unique number for every character。可见,Unicode所做的是为每个字符定义了一个相应的数字表示。比如,“a“的Unicode值是0x0061,“一”的 Unicde值是0x4E00,这是最简单的情况,每个字符用2个字节表示。

Unicode.org定义了百万个以上的字符,如果将所有的字符用统一的格式表示,需要的是4个字节。“a“的Unicode表示就会变成 0x00000061,而“一“的Unicode值是0x00004E00。实际上,这就是UTF32,Linux操作系统上所使用的Unicode方案。

但是,仔细分析可以发现,其实绝大部分字符只使用2个字节就可以表示了。英文的Unicode范围是0x0000-0x007F中文的Unicode范 围是0x4E00-0x9F**,真正需要扩展到4个字节来表示的字符少之又少,所以有些系统直接使用2个字节来表示Unicode。比如Windows 系统上,Unicode就是两个字节的。对于那些需要4个字节才能表示的字符,使用一种代理的手法来扩展(其实就是在低两个字节上做一个标记,表示这是一 个代理,需要连接上随后的两个字节,才能组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种Unicode表示方法就是 UTF16。一般在Windows平台上,提到Unicode,那就是指UTF16了。

至于UTF16-LE和UTF16-BE,与计算机的CPU构架有关。LE指Little Endian,而BE指Big Endian。关于这方面的信息,网上有很多相关的帖子。我们一般的X86系统都是Little Endian的,可以认为UTF16=UTF16-LE.

由于对于欧洲和北美,实际上使用的编码范围在0x0000-0x00FF之间,只需要一个字符就可以表示所有的字符。即使是使用UTF16来作为内存的存 取方式,还是会带来巨大的空间浪费,因此就有了UTF8的编码方式。这是一种很灵活的编码,对于只需要1个字节的字符,就使用一个字节,对于中日韩等原本 需要两个字节才能表示的字符,则通过一个UTF16-UTF8的算法实现相互之间的转换(一般需要3个字节才能表示),而对于需要4个字节才能表示的字 符,UTF8可以扩展到6个字节每个字符。UTF8使用的算法很有意思,大致映射关系如下:
UTF-32                                               UTF8
0x00000000 - 0x0000007F 0xxxxxxx
0x00000080 - 0x000007FF 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

可以发现这和IP的分址算法很是相像。
由于UTF8可以方便的转换为UTF16和UTF32(不需要码表,转换算法可以在Unicode.org上找到C代码)。而且UTF8在每个系统平台上的实现都是一样的,也不存在跨平台的问题,所以UTF8成为跨平台的Unicode很好的解决方案。当然,对于中文来说,由于每个字 符需要3个字节才能表示,还是有点浪费的。

分享到:
评论

相关推荐

    c++ UTF-8 UTF-16转换

    在编程领域,尤其是在涉及到字符编码的时候,理解和操作UTF-8和UTF-16之间的转换是一项基本技能。UTF-8和UTF-16是两种广泛使用的Unicode编码格式,它们各自有其特性和应用场景。本文将深入探讨如何利用C++来实现这两...

    UTF-8 UTF-16 UTF-32转换代码

    UTF-8、UTF-16和UTF-32是Unicode字符集的三种不同编码形式,每种都有其独特的特性和用途。这篇文档将深入讲解这些编码方式,并介绍如何在C语言中进行它们之间的转换。 1. **UTF-8编码** UTF-8是最广泛使用的...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    在C++编程中,UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码...

    utf-8/utf-16转换代码完整版

    最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    UTF-8的优势在于对ASCII字符集的兼容性,前128个Unicode字符(包括英文、数字和常见符号)只需要一个字节表示,这使得UTF-8在互联网上广泛使用,因为其与ASCII的兼容性可以减少传输数据量。此外,UTF-8也支持全球大...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    UTF-8-BOM,全称是“UTF-8 Byte Order Mark”,它在UTF-8编码的文件开头添加了一个特殊的字节序列(0xEF, 0xBB, 0xBF)来标识该文件使用的是UTF-8编码。BOM主要用于帮助软件识别文件的编码,但并非所有UTF-8编码的...

    PB9转换utf-8例子

    标题中的“PB9转换utf-8例子”指的是在PowerBuilder 9(PB9)环境下将数据从非UTF-8编码转换为UTF-8编码的一种解决方案。由于PB9本身不直接支持这种转换,开发者通常需要利用外部库或者特定的编程技巧来实现这个功能...

    C# 生成xml文件,编码为utf-8方法

    C# 生成 XML 文件,编码为 UTF-8 方法 C# 生成 XML 文件,编码为 UTF-8 方法是指在 C# 编程语言中,使用特定的方法和类来生成 XML 文件,并将其编码为 UTF-8 编码格式的过程。这种方法常用于数据交换、配置文件、...

    source insight 3.5 UTF-8中文乱码插件_sourceinsight3.5_utf-8_插件补丁_中文乱码_

    总的来说,"source insight 3.5 UTF-8中文乱码插件"是解决Source Insight 3.5与UTF-8编码不兼容问题的有效工具,通过正确安装和应用此插件,开发者可以更顺畅地在Source Insight环境中阅读和编辑包含中文字符的代码...

    UTF-8 汉字码表

    ### UTF-8编码详解与汉字码表解析 #### UTF-8编码原理 UTF-8(Unicode Transformation Format - 8 bits)是一种变长字符编码,由Ken Thompson于1992年设计,旨在解决多语言环境下字符编码兼容性问题。其核心优势...

    UTF-8编码表

    如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE...

    GBK、UTF-8编码转换工具

    GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...

    pb12 gb转utf-8

    标题中的“pb12 gb转utf-8”指的是在编程领域中进行的一种字符编码转换操作。PB12可能是指PowerBuilder 12,一个流行的Windows应用程序开发工具,而GB和UTF-8则涉及到字符编码标准。 GB(通常指的是GBK或GB2312)是...

    Java解决UTF-8的BOM问题

    BOM的主要作用是在数据传输或存储时标识文件或数据流的字符编码,尤其是区分大端序(Big-Endian)和小端序(Little-Endian)的UTF-16编码。 在Java中,当我们从UTF-8编码的文本文件读取内容时,如果文件开头带有BOM...

    source insight UTF-8插件

    然而,对于处理包含非英文字符,特别是中文字符的UTF-8编码文件时,原生的Source Insight可能会出现乱码问题,这大大降低了对中文代码的阅读体验。为了改善这一状况,我们有了"source insight UTF-8插件"。 这个...

    utf-8 ansi 字符互转 工具

    UTF-8和ANSI是两种常见的字符编码标准,它们各自有其特点和适用场景。本文将深入探讨UTF-8与ANSI字符编码的区别、转换方法以及相关工具。 首先,让我们了解这两种编码的基本概念: 1. **UTF-8**:全称为“Unicode ...

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

    UTF-8的特殊之处在于它包含一个字节顺序标记(BOM),即UTF-8+BOM,但大多数情况下,UTF-8无BOM更常见。 在PHP中,进行字符编码转换可以使用内置函数,如`mb_convert_encoding()`,这个函数可以将字符串从一种编码...

    UTF-16汉字编码表

    与UTF-8相比,UTF-16在处理包含大量非拉丁文字符的语言时具有更好的性能。 #### 二、UTF-16编码原理 UTF-16将Unicode字符集中的每一个字符映射到一个16位或32位的数值上。对于基本多文种平面(Basic Multilingual ...

    UTF-8转ANSI文本文件转换器

    "UTF-8转ANSI文本文件转换器"就是这样一个工具,它能够帮助用户批量将UTF-8编码的文本文件转换为ANSI编码的文本文件。在此,我们将深入探讨UTF-8和ANSI编码的原理以及转换过程中涉及的关键知识点。 **一、UTF-8编码...

    UNICODE与UTF-8转换

    在某些编程语言中,如Python,可以使用内置的函数实现转换,如`str.encode('utf-8')`将UNICODE字符串转换为UTF-8,`str.decode('utf-8')`将UTF-8字符串解码回UNICODE。 **五、实际应用** 在处理文本数据时,了解...

Global site tag (gtag.js) - Google Analytics