`

收录字符编码:ANSI、UNICODE、UTF

阅读更多

早期的计算机只支持英文,所以需要表达的字符数量很少,为此ANSI制定了ASCII字符表,以一个字节的低7位表示字符,这样可以表达128个,当字节的高位为1时,表示的是扩展ASCII字符,ANSI并没有为它们指定标准。
然而,计算机所要表达的并非只有一种语言,为了使ASCII可以支持其他平台,IBM又做了一些修改,利用两个扩展ASCII字符来表达非英文字符,这样可以表达的扩展字符数就到达了14位,即16384个字符。这就是ANSI字符标准。
针 对ANSI每个国家(地区)有自己的编码规范,对中文而言,最早的规范是大家所熟知的大陆的GB2312-80,台湾地区的BIG5以及香港的 HKSCS,后来GB2312发展成GBK,GBK是GB2312的超集,向下兼容,也就是说GB2312的字符编码与GBK相同,只是GBK多了一些字 符定义,现在简体中文的最新编码规范是GB18030,它是GBK的超集,向下兼容,但是据我所知现在还没有哪个操作系统直接支持它。
上面说到的ANSI对英文和其他语言字符编码所需要的字节数不等,或一个或两个,所以被称之为MBCS(多字节编码系统),分辨一个字符占用字节数的办法就是看首位是否为1,如果为1,那么连续的两个字节表述一个字符,否则,是一个ASCII码。
这种编码规范使得各种文字可以在本地化后的计算机系统中正确被处理,但是这里还有个国际化的问题,例如,我们在一个文本文件中同时要显示不同的语言(如中文和日文)时,改怎么办?
因为ANSI针对每种语言的编码没有区分,所以GB2312的一个字符值在BIG5中可能就有另一个字符与之对应,故在读取文本的时候必须要清楚使用什么编码系统,否则就会出现乱码。而对纯文本而言,它的编码方式只能是一种,所以不同语言是不能同时存在的。
这个时候,UNICODE出现了。
UNICODE 使用两个字节对世界上几乎所有的语言进行编码(0x0000-0xFFFF),它可以表达的字符数量为16位,即65536个字符,每种语言的代码段不 同,两个字节所表达的字符是唯一的,所以不同语种可以共存于文本中,然后用系统的UNICODE表进行解码,就可以显示出来。
unicode与ASCII是兼容的,如ASCII的0X76的UNICODE编码就是0X0076。
unicode 的两个字节在处理的时候顺序是不定的,高位字节在前的我们称之为unicode big endian,低位在前的称之为unicode little endian。之所以有这两种编码方式是因为他们对应了intel处理器和Mac处理器的处理方法。对一个字符串,究竟采用什么序列解码呢?这里有个比较 通用的办法BOM,就是在文本的头两个字节插入标志0xFEFF,它叫做"ZERO WIDTH NO-BREAK SPACE"的,是不存在的unicode字符,所以不应该出现在传输中:
FF FE: unicode little endian
FE FF: unicode big endian

unicode并非没有问题的,我们都知道,现在的计算机是以字节为处理单位的,字符串在系统中的表达已经渐渐形成了规范,我们来举个例子:
C 中字符串是以'\0'(0x00)结尾的,当计算机处理的时候看到0x00的时候就知道字符串完了,如果处理的是ANSI编码自然没有问题,可是要命的是 unicode编码中很多字符的两个字节中的一个都是0x00,这样由c处理就会被认为是字符串结束标志,造成错误。解决这个的办法已经有了,就是用 wchar_t表达一个unicode字符,每次读取两个字节,以0x0000表示字符串结束。
另外一个办法就是使用伟大的UTF(UCS Transformation Format )对Unicode进行编码。
UTF是通用字符编码传输格式,根据最小编码单位不同分为分UTF-8(一个字节),UTF-16(两个字节),UTF-32(4个字节)等,我们这里介绍UTF8。

UTF-8
UTF-8将unicode码划分为三段,每一段采用不同的编码方法:

0x0000-0x007F   0x0*******   一个字节, 7bit
0x0080-0x07FF   0x110*****   0x10******   两个字节,11bit
0x0800-0xFFFF   0x1110****   0x10******   0x10******   三个字节,16位
注意,一个字节的表达完全与ASCII兼容。

我们现在有这么多的unicode编码方式,那么怎么判断一个文本使用的是哪种呢?对windows文本文件txt而言,它利用开头的几个字节来判断:
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00   UTF-32/UCS-4, little endian.
00 00 FE FF   UTF-32/UCS-4, big-endian.

遗憾的是,ANSI没有办法与UNICODE区分。
最后给大家一个实验环境:
windows 记事本的保存选项有个编码方式,使用不同的编码方式编码文件就会产生不同的文本代码,然后你用ultraedit打开这些不同编码的文本文件,在16进制 模式下查看,就会看到区别了。不过让我困惑的是,不论它的Unicode编码方式是什么,文件代码居然全部都一样,开头全部是FFFE,不知道这是为什 么。如果哪位知道,请跟个贴分享一下。

分享到:
评论

相关推荐

    Ansi Unicode UTF8编码转换及代码示例

    ### ANSI、Unicode与UTF-8编码转换及相关代码示例 #### 一、基本概念解析 在探讨ANSI、Unicode以及UTF-8之间的转换之前,我们首先需要了解这三种编码的基本概念及其应用场景。 - **ANSI编码**:ANSI(American ...

    ANSI UNICODE UTF8转换

    ANSI、UNICODE和UTF-8是三种常见的字符编码格式,它们各自有着不同的特点和适用场景。了解这些编码方式并能够灵活转换对于开发跨平台、多语言的应用程序至关重要。 首先,让我们详细解释一下这三种编码: 1. ANSI...

    封装ANSI,UNICODE,UTF8互相转换类

    "封装ANSI,UNICODE,UTF8互相转换类"是一个专门解决字符编码转换问题的工具,尤其适用于处理多语言环境下的文本数据。以下是对这些编码方式以及它们之间转换的详细解释: 1. ANSI 编码:ANSI(American National ...

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码格式: - ASCII:美国信息交换标准代码,包含128个字符,主要用于英文和西欧语言,...

    Ansi、Unicode、UTF8字符串之间的转换,wprintf

    在 Windows 操作系统中,常见的字符串编码方式有三种:Ansi、Unicode 和 UTF8。今天我们将详细介绍这三种编码方式之间的转换,包括 Ansi 转 Unicode、Unicode 转 Ansi,以及使用 wprintf 函数进行字符串输出。 Ansi...

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

    本文将深入探讨PHP中的字符编码转换,特别是针对ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-8+BOM的转换。 首先,让我们了解这些编码格式的含义: 1. ANSI编码:通常指的是Windows系统的默认...

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

    可以先将ANSI字符串转换为宽字符(Unicode)字符串,然后再将其编码为UTF8。 3. **UTF8到Unicode**:这个转换相对简单,因为UTF8本身就是Unicode的一种编码。只需解析UTF8编码,转换成相应的Unicode代码点,然后...

    易语言ansi转utf8纯算法源码

    转换过程中,需要识别ANSI编码中的每个字符,并将其映射到相应的Unicode值,然后用UTF-8编码规则重新表示这个Unicode值。 易语言ansi转utf8的纯算法源码实现这一过程,可能涉及以下关键步骤: 1. **读取ANSI文件**...

    [C语言]字符串处理 - ANSI - Unicode - UTF8 转换

    ANSI、Unicode和UTF-8是三种常见的字符编码格式,它们各有特点并适用于不同的场景。了解这些编码之间的转换对于开发跨平台的软件至关重要。 1. ANSI编码:ANSI(美国国家标准协会)编码通常指的是基于特定地区的...

    utf-8、ANSI、Unicode相互转化c++实现

    utf-8、ANSI、Unicode相互转化c++实现 std::string ConverANSI2UTF8(const std::string & str); std::wstring ConverANSI2Unicode(const std::string str); std::wstring ConverUTF82Unicode(const std::string str)...

    utf-8 ansi 字符互转 工具

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

    UTF8,ANSI,UTF7,UNICODE,UTF32等字符集字符串与字节数组互转工具

    本文将深入探讨UTF8、ANSI、UTF7、UNICODE和UTF32这五种字符编码格式,并介绍如何在它们之间进行转换以及字节数组与字符串之间的互换。 1. UTF8(Unicode Transformation Format - 8 bit): UTF8是最常见的...

    字符编码:GBK、GB2312、UTF-8

    本文主要讨论了三种常见的字符编码:GBK、GB2312以及UTF-8。 首先,GBK编码是基于GB2312标准的扩展,兼容GB2312,是中国大陆广泛使用的编码系统。GBK使用双字节来表示所有字符,对于中文字符,其最高位被设置为1,...

    字符编码转换 Text、ANSI、Unicode、Unicode Big Endian、UTF-8、UTF-7

    本篇文章将深入探讨标题中提及的几种字符编码:Text、ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-7,并介绍它们之间的转换。 1. **Text编码**: 在Windows系统中,通常所说的"Text"编码是指...

    XE5 And Upper AES Ansi Unicode UTF8

    Ansi、Unicode和UTF8是字符编码格式,处理这些编码是为了兼容不同语言和字符集的需求。 标签“XE5”,代表了Embarcadero RAD Studio XE5,这是一个集成开发环境(IDE),用于创建跨平台的桌面和移动应用程序。AES是...

    lua utf8 unicode ansi 转换

    a2w(ansi to unicode) u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06

    易语言ANSI+UTF-8解码源码

    在处理字符编码时,易语言提供了对ANSI和UTF-8两种编码的支持,这两种编码方式在计算机领域中扮演着重要的角色。 **ANSI编码**,又称Windows-1252编码,是在ASCII基础上扩展的一种编码方式,主要应用于Windows系统...

    易语言Ansi与Unicode转换源码

    其中,UTF-8是最常用的一种,它具有良好的向后兼容性,能表示所有的Unicode字符,并且对于英文字符,其存储效率与Ansi编码相当。 在易语言中进行Ansi到Unicode或Unicode到Ansi的转换,主要是为了处理不同编码间的...

    c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台

    4. `utf8_to_ansi(char* utf8_str, char* ansi_str)`: 这个函数则将UTF-8字符串转换成系统默认的ANSI编码。与前面的转换不同,这里可能需要根据目标系统动态选择转换规则。 实现这些转换的关键在于理解和正确处理...

Global site tag (gtag.js) - Google Analytics