`

UTF16和UTF8

 
阅读更多
UTF-16
说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。

UTF-8
UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。
UTF-8 有以下编码规则:
  • 如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
  • 如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
  • 如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节


几种编码格式的比较

对中文字符后面四种编码格式都能处理,GB2312 与 GBK 编码规则类似,但是 GBK 范围更大,它能处理所有汉字字符,所以 GB2312 与 GBK 比较应该选择 GBK。UTF-16 与 UTF-8 都是处理 Unicode 编码,它们的编码规则不太相同,相对来说 UTF-16 编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好。它适合在本地磁盘和内存之间使用,可以进行字符和字节之间快速切换,如 Java 的内存编码就是采用 UTF-16 编码。但是它不适合在网络之间传输,因为网络传输容易损坏字节流,一旦字节流损坏将很难恢复,想比较而言 UTF-8 更适合网络传输,对 ASCII 字符采用单字节存储,另外单个字符损坏也不会影响后面其它字符,在编码效率上介于 GBK 和 UTF-16 之间,所以 UTF-8 在编码效率上和编码安全性上做了平衡,是理想的中文编码方式。
分享到:
评论
1 楼 runshine 2013-08-07  
UTF-16并非定长编码...你觉得65535个单元能存储地球上所有的字符?
Java刚诞生时,正处于Unicode2.0,Java选用了Unicode作为自己的字符集(并且早期Unicode与UTF16是不分家视为等同的)。当时那俩合二为一了的字符组织以为65535足以包括所有字符,结果来到亚洲发现,卧槽,自己老祖先太笨 ,只能记住主要的26个字母加其它一些字符一共不到128个,而亚洲光中国的老祖先随随便便就搞出来了上十万个字,那个汗颜呐。只好灰溜溜的跑了回去改变了UTF16的编码方式成为不定长编码。这时候单纯的Unicode已经与UTF16开始不能简单映射了。

同样的GBK,也不能处理所有汉字字符。更何况中国的文字还不止汉字一种。目前最新的国家标准字符集是GB18030.

相关推荐

    c++ UTF-8 UTF-16转换

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

    UTF8-无BOM转为UTF16LE

    本主题主要关注UTF8和UTF16LE两种不同的字符编码格式之间的转换,特别是如何进行无BOM(字节顺序标记)的处理。下面我们将深入探讨这两种编码方式以及它们在实际应用中的转换。 首先,UTF8是一种广泛使用的变长...

    UTF8转16进制工具 Utf8ToHex

    UTF-8和16进制编码是两种常见的表示方式,尤其在程序开发、数据传输和存储时经常遇到。标题中的"UTF8转16进制工具 Utf8ToHex"指的是一个能够将UTF-8编码的字符串转换成16进制表示形式的实用工具。描述中提到的例子,...

    C/C++语言UTF16和UTF32互相转换生成文件

    在项目"UTF16-UTF32V2.0"中,很可能提供了一个完整的C/C++实现,实现了UTF-16和UTF-32之间的转换,以及文件读写功能。这样的工具对于跨平台的文本处理,尤其是在需要在不同编码之间切换的场景下,是非常有价值的。在...

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

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

    实现ascii ,utf8,utf16三种编码之间的转换.zip

    在C++中,可以使用`std::wstring_convert`和`std::codecvt_utf8`或`std::codecvt_utf16`等库来进行编码转换。然而,这些在C++17之后已被标记为过时,因此现代的C++代码可能会使用第三方库如`iconv`或者`boost`中的...

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

    随着Unicode标准的发展和移动设备的普及,4字节字符的使用越来越普遍,这就使得UTF8MB4成为了一个必要选择。 三、问题根源与解决方案 早期的UTF-8编码格式理论上可以使用1到6个字节,但后来的规范限制在1到4字节,...

    UTF-16汉字编码表

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

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

    例如,可能有`UTF8toUTF16()`、`UTF16toUTF8()`、`UTF32toUTF16()`以及`UTF16toUTF32()`等函数,它们负责将一个编码的字符串转换为另一种编码。 5. **转换原理** 转换过程中,关键在于理解每个编码的结构和规则。...

    Delphi REST 服务器返回UTF16编码转换成正常string示例.rar

    当我们从服务器接收到UTF16编码的数据时,可能需要手动进行解码,以便在应用程序中正确地显示和处理这些字符串。下面将详细介绍这个过程。 1. **理解UTF16编码**: UTF16是一种变长的Unicode编码,每个字符可以由...

    UTF-8 相互转换 UTF16

    UTF-8 相互转换 UTF16

    从UTF16到UTF8到UTF16的简单基于CString的转换

    本篇文章将详细探讨如何使用MFC中的CString类在UTF8和UTF16之间进行转换,适用于Visual Studio 7.1、8.0等版本,并兼容CE2.11、CE3.0、CE2.10等嵌入式平台。 首先,了解UTF16和UTF8的基本概念。UTF16使用16位(2...

    GBK和UTF-16编码的转换接口

    包含GBK和UTF16字符集的对照表,用于将GBK字节流和UTF字符串之间的互相转换。

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

    本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码的内置类型,但是我们可以通过`std::string`类来间接地操作UTF-8字符串。`std::string`通常用来...

    CString转UTF8,UTF8转CString

    3. **CP_ACP** 和 **CP_UTF8**:分别表示当前系统的ANSI代码页和UTF-8编码。 #### 二、CString转UTF-8 首先,让我们来看看`CString`到UTF-8编码字符串的转换方法: ```cpp CString CNurseDialog::multiToUtf8...

    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

    在VB6中,由于其内置的字符串操作函数不直接支持UTF-8,因此我们需要自定义函数或利用第三方类库来实现UTF-8的编码和解码。 "utf8.zip"这个压缩包包含了VB6中处理UTF-8所需的相关资源。其中,“cutf8.cls”很可能是...

    tinyxml - utf16.cpp

    以UTF=16LE编码方式保存或读取文件,可以结合博客“c++ 以UTF-16LE编码方式保存文件”查看辅助理解

    C语言UTF8到ANSI和Unicode转换代码

    本文将深入探讨C语言中UTF8、ANSI和Unicode字符集之间的转换方法,以及如何在MFC(Microsoft Foundation Classes)项目中集成这些转换代码。 首先,我们要了解UTF8、ANSI和Unicode的概念。UTF8是一种变长的Unicode...

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

    UTF-8的最大优点在于其向后兼容ASCII,因此在网络传输和存储中被广泛应用。 UTF-8-BOM,全称是“UTF-8 Byte Order Mark”,它在UTF-8编码的文件开头添加了一个特殊的字节序列(0xEF, 0xBB, 0xBF)来标识该文件使用...

Global site tag (gtag.js) - Google Analytics