`
yuanc00
  • 浏览: 29889 次
社区版块
存档分类
最新评论

Unicode和UTF-8转换方法的理解

阅读更多
    下面是关于Unicode和UTF-8之间转换方法的引用
写道
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
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
下面,还是以汉字“严”为例,演示如何实现UTF-8编码。
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

 

   开始看例子的时候,并不理解为什么4E25处在第三行的位置。因为把“0000 0080-0000 07FF”这个给弄拧了,没有看懂这个表示的意思。这是一个范围的表示,意思是当Unicode编码的值在“0000 0008”到“0000 FFFF”之间的时候,采用第三行的编码。4E25显然在这个范围中;这是正确的理解。


    当时我并没有理解,于是进行了反推。将4E25表示成二进制数,即“0100 1110 0010 0101”。它有十六位,与此同时,第三行的可变的二进制位,也恰好是16个。看来问题就在这里, Unicode的表示范围和表示成二进制后的UTF-8编码的可变长度是相匹配的。比如,对于“0000 0000”到“0000 007F”范围的Unicode,最多只有7个有效二进制位,所以加上一个标识符,刚好可以在一个字节中进行表示;而对于第三行的UTF-8编码,它能容纳的可变二进制位是16个,所以能表示的最大Unicode码是“0000 FFFF”。


    按照这个规则,当然可以一直表示下去,但是对于一个字符,最多4个字节就可以了,所以没有必要继续扩展了。

 

分享到:
评论

相关推荐

    UNICODE与UTF-8转换

    **标题:**UNICODE与UTF-8转换 **正文:** 在计算机科学中,字符编码是用于表示文本的一种方式,特别是在计算机系统中。UNICODE和UTF-8是两种广泛使用的字符编码标准,它们各自有着独特的特性和应用场景。本文将...

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

    "字符集Unicode与UTF-8之间的转换" 在计算机科学中,字符集和编码方式是非常重要的概念,特别是在多语言环境中。...通过本文的介绍,读者可以更好地理解Unicode和UTF-8的区别和转换方法,并在实际开发中应用这些知识。

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

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

    c++ UTF-8 UTF-16转换

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

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

    总之,理解和实现Unicode到UTF-8的转换是提升C++编程能力的一个重要方面。这个过程涉及字符编码理论和实践,对于理解和处理各种编码问题具有深远的意义。通过不断实践和研究,你将能够熟练地处理各种字符编码问题,...

    VB6.0 UTF-8转换GB2312函数

    在VB6.0编程环境中,有时我们需要处理不同字符编码之间的转换,例如将UTF-8编码的字符串转换为GB2312编码。UTF-8是一种广泛使用的Unicode编码,而GB2312是中国大陆常用的简体中文字符集,主要用于早期的计算机系统。...

    c gbk和 utf-8 转换

    在C语言中,由于没有内置的GBK或UTF-8转换函数,我们需要自定义算法来实现编码转换。主要的过程可以分为两个步骤:首先从GBK转换到Unicode,然后从Unicode转换到UTF-8。 1. GBK转Unicode: - GBK编码中,每个字符...

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

    总的来说,理解和掌握UTF-8和GBK这两种编码格式的特性以及如何在LabVIEW中进行转换,对于进行多语言编程和数据交换的开发者来说至关重要。"UTF-8toGBK.vi"这个VI提供了一个实用的工具,可以帮助开发者解决在处理中文...

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

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

    StdioFile unicode-utf-8操作

    如果想要使用这些函数,需要先将UTF-8转换为宽字符,然后再进行操作。 5. 使用第三方库: 对于更复杂的UTF-8操作,可以考虑使用第三方库,如libiconv、ICU或Boost.Locale,它们提供了更完善的Unicode和编码转换...

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    总之,C语言虽然没有内置的字符编码转换机制,但通过理解不同编码的原理和使用适当的库或API,可以实现UNICODE、GBK和UTF-8之间的转换。在进行这样的编程时,确保充分理解字符编码的细节,以及处理异常情况的方法,...

    C#写的 GBK GB2312 UTF-8转换

    在这个例子中,`Encoding.GetEncoding("GBK")`获取了GBK编码器,`GetBytes()`方法将GBK编码的字符串转换为字节数组,然后`Encoding.UTF8.GetString()`将这个字节数组还原为UTF-8编码的字符串。 对于文件的编码转换...

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

    4. **国际化和本地化**:如果你的程序需要支持多种语言,那么处理UTF-8就显得尤为重要,因为它能表示所有Unicode字符,包括非拉丁语系的字符。 5. **文件I/O**:当读写文件时,确保文件以UTF-8编码打开,这样可以...

    utf-8码转换器(转换成utf-8码)

    在IT行业中,理解和使用UTF-8编码是非常基础且重要的知识。 1. **Unicode与UTF-8**: Unicode是一个国际字符集,包含了世界上几乎所有的文字系统,包括拉丁文、汉字、阿拉伯文、希伯来文等。UTF-8是Unicode的一种...

    JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    本文将详细介绍Unicode、ISO-8859-1、GBK和UTF-8这四种常见的字符编码,并探讨它们之间的转换方法。 #### 二、基础知识 ##### 1. Unicode Unicode是一种国际字符编码标准,旨在支持世界上几乎所有语言的文字。它为...

    gb2312与utf-8转换

    总的来说,GB2312和UTF-8都是字符编码的重要形式,理解它们的区别和转换方法对于处理中文文本至关重要。正确地进行编码转换有助于确保信息的准确传递和兼容性,避免因编码不匹配而产生的乱码问题。

    ASCII 及UTF-8 与字符互相转换

    ASCII 和 UTF-8 是两种广泛使用的字符编码标准,它们在计算机...了解它们之间的差异和转换方法,对于理解和处理各种文本数据至关重要。在处理涉及不同编码格式的数据时,需要谨慎操作,以确保信息的准确性和可读性。

    utf-8 ansi 字符互转 工具

    总结来说,理解和掌握UTF-8与ANSI字符编码的差异,以及如何进行转换,对于解决跨平台、多语言环境下的文本处理问题至关重要。在日常工作中,我们可以利用各种工具和编程手段,灵活应对不同编码格式带来的挑战。在...

    pb12 gb转utf-8

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

    多字节与UTF-8、Unicode之间的转换

    本篇文章主要探讨的是多字节(MBCS)编码与UTF-8、Unicode编码之间的转换方法,并深入分析了给定代码片段中的六个函数实现细节。 #### 一、基础知识概述 1. **多字节字符集(MBCS)**:多字节字符集是指非固定长度...

Global site tag (gtag.js) - Google Analytics