`
tommyzhangming
  • 浏览: 4742 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多
UTF8是一种储存和传送的格式。

UTF8是以8bits即1Bytes为编码的最基本单位,也可以基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前使用不多,而UTF8则被广泛应用在文件储存和网络传输中。

编码原理

先看这个模板:

UCS-4 range (hex.) UTF-8 octet sequence (binary)

0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx

编码步骤:
1) 首先确定需要多少个8bits(octets)

2) 按照上述模板填充每个octets的高位bits
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
4) 解码的原理一样。

实例:(留意每个bit的颜色,粗体字为模板内容)

UCS-4 UTF-8
HEX BIN Bytes BIN HEX Bytes
0000 000A 00001010 4 00001010 0A 1
0000 0099 10011001 4 11000010 10011001 C2 99 2

0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3

以UTF8格式储存的文件档首标识为EF BB BF。

效率

从上述编码原理中得可以得以下结论:
1.每个英文字母、数字所占用空间为1 Byte。
2.汉字占3 Bytes。
而直接使用无论是ANSI还是Unicode/UCS2来编码,中文都只占用2字节。所以UTF8对英文来说是个非常好的方案,但对中文来说并不是一个好的选择。

也就是说,英文编码一般用UTF8,中文使用的是GB18030

Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.

UCS:

ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.

Unicode与UCS的关系:
ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始,
unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值,
使得两者保持一致.

UCS的编码方式:
UCS-2, 与unicode的2byte编码基本一样.
UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.

UTF: Unicode/UCS Transformation Format

UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.

UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.

而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码,
没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题.
采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.

中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码,
地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码.
GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.
分享到:
评论

相关推荐

    全面了解mysql中utf8和utf8mb4的区别

    MySQL中的UTF8与UTF8MB4是两种不同的字符编码方式,它们主要的区别在于对Unicode字符集的支持程度。本文将深入探讨这两种编码的区别,以便更好地理解它们在实际应用中的选择。 一、UTF8与UTF8MB4简介 UTF8是...

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    这里我们将深入探讨UTF8和UTF8MB4两种编码格式,以及它们各自的排序规则`utf8mb4_unicode_ci`和`utf8mb4_general_ci`。 首先,UTF-8是一种广泛使用的Unicode字符编码方案,它允许使用1到4个字节来表示不同的字符。...

    utf8.zip_UTF8_VB6 UTF-8_cutf8.cls_utf8解码在线_vb6

    "utf8.zip"这个压缩包包含了VB6中处理UTF-8所需的相关资源。其中,“cutf8.cls”很可能是一个自定义的类模块,用于实现UTF-8编码和解码功能。类模块是一种封装代码的方式,它将相关的方法和属性组合在一起,方便在多...

    UTF8转16进制工具 Utf8ToHex

    标题中的"UTF8转16进制工具 Utf8ToHex"指的是一个能够将UTF-8编码的字符串转换成16进制表示形式的实用工具。描述中提到的例子,中文的“你好”在UTF-8编码下是"\xE4\xBD\xA0\xE5\xA5\xBD",这个就是将UTF-8编码转换...

    CString转UTF8,UTF8转CString

    int len = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)str_utf8, -1, NULL, 0); wchar_t *wszMulti = new wchar_t[len + 1]; memset(wszMulti, 0, len * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)...

    lua-utf8.zip

    Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本,使用64位版本时会报错“lua-utf8.dll 不是有效的 Win32 应用程序”) 将lua-utf8库放在openresty安装目录下,使用时用require引入。

    批量转UTF8工具-批量转UTF8工具

    UTF8编码是目前互联网上最广泛使用的字符编码标准,它能有效地表示世界上几乎所有的文字系统,包括汉字、拉丁字母、希腊字母等。批量转UTF8工具则是针对那些需要将大量文本文件从其他编码格式(如GBK、BIG5等)转换...

    易语言UTF8解码

    易语言UTF8解码是关于在易语言编程环境中处理UTF-8编码的一种技术。UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode标准中的所有字符。易语言是中国开发的一款面向初学者和专业开发者的编程语言,其...

    Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    用了这么长时间,发现...那么在utf8_bin中你就找不到 txt = ‘A’ 的那一行, 而 utf8_general_ci 则可以. utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。 utf8_general_cs 区分大小写,如果

    UTF8 to excel

    标题“UTF8 to excel”指的是将UTF8编码的文本数据转换为Excel电子表格的过程。在IT领域,UTF8是一种广泛使用的字符编码标准,它能够表示几乎所有的世界语言字符,包括中文。Excel是Microsoft Office套件中的一个...

    JS GB2312转UTF8 支持中英文混合

    JS GB2312TOUTF8 UTF8TOGB2312 编码转换 /* * GB2312转UTF8 * 例: * var xx=new GB2312UTF8(); * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa"); * var Gb2312=xx.Utf8ToGb2312(Utf8); * ...

    UTF8-无BOM转为UTF16LE

    UTF8的特点是前几个字节用于识别字符的范围,对于ASCII字符(英文字符和某些符号),UTF8只使用一个字节,这使得UTF8在处理英文文本时非常高效。无BOM的UTF8意味着文件开头没有特定的3字节标识符(0xEF, 0xBB, 0xBF...

    utf8与string的相互转换

    original_string = utf8_bytes.decode('utf-8') ``` 在Java中,转换过程类似,但使用`getBytes`和`new String`方法: ```java // 字符串转UTF-8字节数组 byte[] utf8Bytes = myString.getBytes("UTF-8"); // UTF-...

    c语言gbk、utf8转换编码表及函数

    在C语言中,字符编码是非常重要...通过`utf8gbk.h`和`utf8gbk.c`这两个文件,你可以直接在C程序中实现GBK与UTF-8的转换,从而满足项目的需求。不过,要注意,这些函数可能需要根据具体环境和需求进行适当的修改和优化。

    如何更改MySQL数据库的编码为utf8mb4

    MySQL数据库的编码转换至utf8mb4是为了更好地支持Unicode字符集,尤其是对于包含四字节表情符号和其他特殊字符的数据。utf8mb4是utf8的扩展,它不仅完全兼容utf8,还能处理更多的Unicode字符范围,包括现代社交媒体...

    labview text to utf8

    "labview text to utf8" 这个标题表明我们要探讨的是如何在LabVIEW中将包含汉字的字符串转换成UTF-8编码格式,以便在不同系统或平台之间进行兼容的数据传输。 默认情况下,LabVIEW可能会使用本地的字符编码,如ANSI...

    labview utf8toGBK

    "labview utf8toGBK"这个项目就是为了解决这个问题而设计的。 在计算机世界中,文本的表示方式是通过特定的编码系统来实现的。UTF-8和GBK是两种常见的汉字编码格式。UTF-8(8位统一 Transformation Format)是一种...

    TXT批量转UTF8格式

    "TXT批量转UTF8格式"的主题涉及到的是文件编码转换,特别是针对纯文本文件(TXT)的批量处理,将它们从非UTF-8编码转换为UTF-8编码。UTF-8是一种广泛使用的字符编码标准,支持几乎全球所有的字符,包括中文、英文和...

    UTF8_TO_HEX

    标题“UTF8_TO_HEX”指的是一个程序或功能,它的主要任务是将UTF-8编码的字符串转换成拉丁字母(Latin1)编码表示的形式。在计算机领域,字符编码是用来表示文本的一种方式,不同的编码标准适用于不同的语言和地区。...

    批量utf文件转utf8-bom

    "批量utf文件转utf8-bom"这个主题指的是将一批以UTF编码的文件转换为带有BOM(Byte Order Mark)的UTF-8编码。BOM是一个特殊的字节序列,用于标识文件的编码类型,对于UTF-8编码,BOM的字节序列为0xEF, 0xBB, 0xBF。...

Global site tag (gtag.js) - Google Analytics