字符编码Unicode、UTF-8和ANSI的详解

NSI、UTF-8、Unicode为字符代码的三种编码格式,一个字符可以被编码成ANSI、UTF-8或Unicode格式,这三种格式只是表现形式不一样,其表示内容是一样的。

ANSI、UTF-8、Unicode

ANSI、UTF-8、Unicode为字符代码的三种编码格式,一个字符可以被编码成ANSI、UT-F8或Unicode格式,这三种格式只是表现形式不一样,其表示内容是一样的。如下表:

char ANSI(GBK) Unicode UTF-8
中 0xD6D0 0x4E2D 0xE4B8AD

ANSI编码

ANSI表示英文字符时用一个字节,表示中文用两个字节

为了使计算机支持多种语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表一个字符(ASCII编码),而这之外的字符通常是使用0x80~0xFF范围内的两个字节来表示一个字符。比如汉字找那个的’中’在简体中文中使用[0xD6, 0xD0]这两个字节存储。

下表中展示了文在不同ANSI标准下的编码:

char ANSI(GBK) ANSI(Big5) ANSI(JIS) Unicode UTF-8
文 0xCEC4 0xA4E5 0x95B6 0x6587 0xE69687
可以看出,不同ANSI编码之间互不兼容,当信息在国际间交流
时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。需要将不同的ANSI编码都转换成UTF-8编码,进而存储。

Unicode编码

Unicode字符集编码全称:Universal Multiple-Octet Coded Character Set,通用多八位编码字符集。Unicode字符集是国际组织制定的可以容纳世界上所有文字和符号的编码方案。

Unicode编码使用两个字节(0x0000-0xFFFF)来表示一个字符,世界上任何文字和符号都对应于Unicode字符集中的一个二进制代码,但是:

Unicode只是一个符号集, 它只规定了符号的二进制代码, 却没有规定这个二进制代码应该如何存储。

Unicode编码的优点是覆盖了世界上所有的文字和符号,缺陷则是对于英文字符浪费了一个字节。例如:英文A在unicode中表示为0x0041。

UTF-8编码

UTF-8是Unicode的实现方式之一。

UTF-8全称:8bit Unicode Transformation Format,8比特Unicode通用转换格式。UTF-8是一种针对Unicode的可变长度字符编码。可以表示Unicode标准中的任何一个字符,且其编码中的第一个字节仍然与ASCII兼容。

UTF-8是一种变长的编码方式,可以使用1~6个字节对Unicode字符集进行编码,编码规则如下:

1) 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于
英语字母, UTF-8编码和ASCII码是相同的.

2) 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前
两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.

n Unicode符号范围 UTF-8编码方式

1 0000 0000 - 0000 007F 0xxxxxxx
2 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
3 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 0020 0000 - 03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 0400 0000 - 7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

注:在UTF-8编码中,英文字符占一个字节,中文字符占用3个字节。

总结
1、中文操作系统默认ansi编码,生成的txt文件默认为ansi编码。

2、国际文档(txt和xml)使用unicode编码是正宗做法;操作系统和浏览器都能够“理解”unicode编码。浏览器“迫于压力”才“理解”utf-8编码。但是,操作系统有时只认unicode编码。

3、Windows记事本有四个编码选项:ANSI、Unicode、Unicode Big Endian和UTF-8。

ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。
Unicode big endian编码与上一个选项相对应。采用big endian格式。
UTF-8指带BOM 的UTF-8。
ANSI、UTF-8、Unicode转换
Windows Unicode and Character Sets
Unicode编码字符集是最通用的字符编码标准,Windows应用程序使用Unicode字符集的UTF-16实现版本。同时,Windows也支持传统的字符集:单字节字符集(Single-byte character sets, SBCS)和多字节字符集(Multibyte character sets)。

很多Windows API函数拥有“A”和“W”版本,“A”版本基于Windows Code Page,而“W”版本则基于Unicode字符。应用程序可以通过WideCharToMultiByte和MultiByteToWideChar两个函数来转换Unicode字符串和基于Windows Code Page字符串。虽然函数名中含有“MultiByte”,这些函数实际上能处理SBCS、DBCS和multibyte character set Code page。

编码转换
在Windows平台下,ANSI、UTF-8、Unicode三者之间的转换主要依赖于WideCharToMultiByte和MultiByteToWideChar两个函数。

Unicode转UFT-8:设置WideCharToMultiByte的CodePage参数为CP_UTF8;
UTF-8转Unicode:设置MultiByteToWideChar的CodePage参数为CP_UTF8
Unicode转ANSI:设置WideCharToMultiByte的CodePage参数为CP_ACP;
ANSI转Unicode:设置MultiByteToWideChar的CodePage参数为CP_ACP;
UTF-8转ANSI:先将UTF-8转换为Unicode,再将Unicode转换成ANSI;
ANSI转UTF-8:先将ANSI转换为Unciode,再将Unicode转换成ANSI。

时间: 2024-12-01 12:52:46

字符编码Unicode、UTF-8和ANSI的详解的相关文章

输出字符缓冲区太小,无法包含解码后的字符,编码 Unicode (UTF-8) 的操作回退

问题描述 调试程序时,出现异常:输出字符缓冲区太小,无法包含解码后的字符,编码Unicode(UTF-8)的操作回退,一头雾水.代码如下FileStreamfsread=newFileStream("123.dat",FileMode.Open,FileAccess.Read);System.Text.Encodingencoding=System.Text.Encoding.UTF8;BinaryReaderbinReader=newBinaryReader(fsread,encod

彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)

最近有一些朋友常问我一些乱码的问题,和他们交流过程中,发现这个编码的相关知识还真是杂乱不堪,不少人对一些 知识理解似乎也有些偏差,网上百度,google的内容,也有不少以讹传讹,根本就是错误的(例如说 unicode编码是两 个字节),各种软件让你选择编码的时候,常常是很长的一个选单,让用户不知道该如何选.基于这样的问题,我就写 下我的理解吧,一方面帮助一些需要帮助的人纠正认识,一方面作为自己以后备查的资料. 1.ASCII(American Standard Code for Informat

计算机中的字符串编码、乱码、BOM等问题详解_相关技巧

因为电脑是windows 7系统,开发环境又在linux,经常在linux碰到乱码问题,很是痛苦,于是决定好好了解编码的来龙气脉,并分享个各位,免得出现乱码时不知所措. 是否存在文件编码 在讲解字符编码之前,我们需先明确文件本身没有编码一说,只有文字才有编码的概念,我们通常说某个文件是什么编码,通常是指文件里字符的编码. vim为什么会出现乱码 我在linux下一般使用vim进行文件编辑,发现经常会碰到乱码的情况,那么为什么会出现乱码呢? 首先我们了解下vim编码方面的基础知识,关于编码方面vi

编码,解码,乱码,问题详解

编码解码核心 字符 内码 字符集 系统编码 windows Linux Python中的编码问题 系统编码 Python编码 方式一 方式二 方式三 文件编码 实例一 实例二 Python中字符串和Unicode的区别 PHP中的编码 header set names XX 数据库中的编码 JSP乱码 JSP页面本身 数据库连接语句 Tomcat方面 过滤器Filter 总结 在开发的过程中,我们不可避免的会遇到各种各样的编码,解码,或者乱码问题,很多时候,我们可以正常的解决问题,但是说实在的,

JavaScript Unicode 字符编码详解教程

Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况.很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况). 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 它从0开始

再谈Python中的字符串与字符编码(推荐)_python

本节内容: 1.前言 2.相关概念 3.Python中的默认编码 4.Python2与Python3中对字符串的支持 5.字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章.有的人云亦云,也有的写得很深入.近日看到某知名培训机构的教学视频中再次谈及此问题,讲解的还是不尽人意,所以才想写这篇文字.一方面,梳理一下相关知识,另一方面,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的

详解PHP编码转换函数应用技巧_php实例

在PHP中有数量庞大的函数来支持我们的需求应用.下面介绍的这个函数就是有关PHP编码转换函数.希望对大家有所帮助.mb_convert_encoding 函数为PHP内部多字节字符串编码转换函数. 可以在有需要的使用场合(如:解决在GB2312编码环境下使用Ajax产生的中文字乱码的问题)方便进行编码转换,以解决网页乱码的问题,使用非常方便,效率非常高,几乎支持所有编码.PHP 4 >= 4.0.6.PHP 5 版本支持. PHP编码转换函数原型: /**  * 多字节字符串编码转换函数  * 

ASP编码和解码函数详解_应用技巧

用ASP开发的时候遇到一个解码问题.虽然在ASP中使用Request获取编码过URL字符串会自动解码,但是Request.BinaryRead(Request.TotalBytes)取得Post数据时却不会解码,所以只能手动进行解码.ASP解码函数: Function URLDecode(enStr) dim deStr,strSpecial dim c,i,v deStr="" strSpecial="!""#$%&'()*+,.-_/:;<

字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian

1.字符编码.内码,顺带介绍汉字编码  字符必须编码后才能被计算机处理.计算机使用的缺省编码方式就是计算机的内码.早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5.  GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号.汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768.其中有5个空位是D7FA-D7FE.  GB2312支持的汉字太少.1995年的汉字扩