UTF-8与GBK字符集解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UTF-8与GBK字符集解析相关的知识,希望对你有一定的参考价值。

参考技术A

简单来说,Unicode就是给世界上存在的字符都赋予唯一的二进制编码。

因为Unicode要编码所有可能的字符,那么每个字符占用的字节长度就会变多。以英文为例,一个英文字符使用ASCII码只需要一个字节,而用Unicode需要4个字节,甚至更多。并且前面的字节都是0。这样纯英文文件的存储大小就会成倍扩大,是极大的浪费。

一种变长的编码方式,基于Unicode的一种实现。它使用1--4个字节表示一个字符,根据不同的字符变化字节的长度,可以节省空间。编码规则如下:

根据上表可以看出,UTF-8剩余可以填的位数,决定了对应Unicode编码的范围。 下面举个转换的例子:
"樊" 的unicode是6A0A(0110 1010 0000 1010),查表可知,6A0A属于第三行的范围,因此"樊"的UTF-8编码需要三个字节,即格式是 1110xxxx 10xxxxxx 10xxxxxx 。然后,从6A 0A的最后一个二进制位开始,从后向前填入格式中的x,多出的位补0。最终,"樊"的UTF-8编码是11100110 10101000 10001010(E6 A8 8A)
由此可以总结出字符用UTF-8编码的规律:

注: UTF-8并没有编码所有的Unicode的字符,只包含了第0号平面(plane)和部分1号平面的字符。这属于更深层次的探究,感兴趣的读者可以通过 UTF-8 与 Unicode字符平面映射 了解。

该字符集使用2个字节表示一个字符。简单地理解,一个小于127的字节的意义与ASCII码相同,但两个大于127的字节连在一起时,就是GB2312编码的字符。以下是两个字节的具体范围:
第一个字节的范围是0xA1(161)–0xF7(247) ; 第二个字节的范围是0xA1(161)–0xFE(254)
共收录了6763个汉字,还包括拉丁字母、希腊字母、日文字符。并对 ASCII 里已有的数字、标点、字母赋予了两个字节的编码,这就是”全角”字符,而小于127的就称为”半角”字符。

由于GB2312仅包含了常用汉字,没有编码生僻字以及繁体字,GBK就对其进行了扩展。简单地理解,只要第一个字节大于127,不管后面的字节是否大于127,就是GBK编码的字符。以下是两个字节的具体范围:
第一个字节的范围是0x81(129)–0xFE(254) ; 第二个字节范围一部分在0x40(64)–0x7E(126),另一部分在0x80(128)–0xFE(254)
这样扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,提供了23940个编码,使用了21886个。

UTF-8编码汉字通常需要三个字节,而GBK只需要两个字节,所以对于纯中文、不考虑国际化,且对流量和存储大小比较敏感的应用,可以使用GBK编码节省存储空间和传输流量。

原 博文 发布在个人博客,欢迎访问!!

oracle编码gbk加载utf-8文件需要转码么?

是的,Oracle编码GBK加载UTF-8文件需要转码。由于Oracle数据库使用的是GBK编码,而UTF-8文件使用的是UTF-8编码,因此在加载UTF-8文件之前,需要将文件的编码从UTF-8转换为GBK。转码的过程非常简单,只需要使用Oracle的转换函数,将UTF-8文件转换为GBK编码,就可以加载到Oracle数据库中。 参考技术A 在Oracle中加载utf8文件时,需要进行转码,以便数据以正确的格式读取。建议使用UCS2字符集对数据进行转码,以确保数据的正确性。 参考技术B 需要。把UTF8编码转变成GB2312即可实现对高频词的排序 Select Name From whm_c。

以上是关于UTF-8与GBK字符集解析的主要内容,如果未能解决你的问题,请参考以下文章

字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码

解析gbk格式带中文的xml

UTF-8编码与GBK编码下的字符长度

PHP中SimpleXMLElement对象字符编码

QT中将gbk字符转换为utf-8字符

字符编码