说说字符编码的那些事儿

ASCII编码,就是英文显示文字所需要的256个字符(比如,英文字母、数字、标点符号等等),每个字符用一个字节表示,即单字节编码(SBCS,char),ASCII码表定义了数值和字符的映射关系。

ANSI在保留ASCII编码的基础上,对其进行了扩展,使用2个(或多个)字节来代表一个字符,即多字节编码(MBCS,char),它是一种泛称,要结合具体的CodePage(也称编码字符集、代码页)才能确定编码。不同国家或地区制定了不同的标准(数值与字符的映射关系),通过不同的CodePage来定义各自不同的映射关系。不同语言的操作系统,使用的CodePage不一样,比如中文操作系统ANSI代表GB2312,日文操作系统ANSI代表JIS。GBK、GB2312是定义汉字编码的2个CodePage,其中GB2312是对GBK的扩展,完整包含GBK字符集。

UNICODE对全世界所有语言文字进行统一编码,它有2种规范UCS-2、UCS-4,一般使用UCS-2,它规定字符一律用两个字节表示,即双字节编码(DBCS,wchar)。UTF8、UTF16是UNICODE编码存储、传输方式的2种不同实现。UTF8用一个字节表达英文字母,用两个(或多个)字节表达其他语言中的字符,UTF16统一用两个字节表达一个字符(包括英文字母、其他文字),编码与UNICODE是等价的。BOM(byte order mark),即文本文件最开头的几个标识字节,用来说明编码方式,utf-8的BOM是0xef 0xbb 0xbf,utf-16le(Little Endian)的BOM是0xff 0xfe,utf16-be(Big Endian)的BOM是0xfe 0xff。

UTF8、UTF16实际上与ANSI是同一层次上的概念,他们都是一种字符编码方式,区别在于,UTF8、UTF16使用的是UNICODE定义的一个能容纳全世界所有语言的CodePage,即UTF8、UTF16代表的是一种确定的字符编码,而ANSI则需结合具体的CodePage才能确定编码方法,所以我们在切换文件编码格式时,经常看到UTF8通常和GB2312、ISO-8859-1等CodePage以平级的形式出现。UNICODE、ASCII都可以看做是一个CodePage,定义了数值和字符的映射关系,其中ASCII码表被所有编码方式兼容,这意味着英文内容,不论以那种编码方式处理,总能被正确显示。

CodePage不仅要定义数值和本地文字的映射关系,还要定义数值和UNICODE字符的映射关系,这样,不同的ANSI编码(CodePage),就可以通过UNICODE互相转换了。不过,这种字符编码转化,通常只有在UTF8(或其他UNICODE编码实现)与本地CodePage间进行才是有意义的,在本地CodePage与其他语言的CodePage间转化没有任何意义,文字显示和语义都是错误的。CodePage可以用数值型ID表示,也可以用字符串型name表示,注意ID和name并非是业界统一定义的,比如gb2312字符集,在VS中的名称为gb2312,而iconv中对应的名称则是cp936。

Windows平台的API有2套,分别是unicode版和ansi版,若使用unicode版的API,要确保传入的字符串是unicode编码,若使用ansi版的API,要确保传入的字符串编码与操作系统的默认字符集编码匹配,比如简体中文操作系统下,传入的字符串必须是gb2312编码(utf8编码不行),否则中文字符就会显示为乱码,这就是一切乱码的根本原因。当你用文本编辑器打开一个文本文件时,编辑器会根据文件自身提供的信息,推测文件编码方式,然后将其转换成操作系统的默认字符集进行显示,如果编辑器推测错误则可能产生乱码,此时,你可以手工指定按哪种编码方式对文本内容进行转换。

Visual Studio默认按ANSI编码保存和处理源文件,因此在VS中打开一个UTF8编码的源文件,中文会显示成乱码,可以通过修改VS默认编码解决此问题。要注意的是,即使把VS默认编码改成UTF8,代码中定义的字符串常量在程序执行时,仍然是按操作系统的默认字符集编码,而非源文件保存时使用的编码。比如代码中定义了一个字符串常量"中国",即使源文件是以UTF8编码保存,但在代码执行时,"中国"这个常量依然使用的是操作系统的默认字符集编码,可以通过将字符串常量输出到日志文件证实。其实这点也不难理解,程序实际运行时使用的字符串常量,来自于PE文件,而非源文件,编译器完全可以在编译阶段,将常量字符串编码进行转换(从源文件编码,转化为操作系统默认编码),然后输出到obj文件中,最终链接到PE文件里。

最后再补充一点,WINDOWS简体中文操作系统默认使用gb2312字符集,linux(含android、mac、ios等)操作系统默认使用的都是utf8编码,这意味着linux对不同地区的语言文字有着更为广泛的支持!

1
时间: 2024-12-25 11:40:56

说说字符编码的那些事儿的相关文章

XSS与字符编码的那些事儿

目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 0x00基本介绍 提起XSS 想到的就是插入字符字符编码与各种解析了! 这也就是各种xss编码插件跟工具出世的原因!之前不懂浏览器是如何对我们编码过的代码进行解析的时候就是一顿乱插! 各种编码 各种插 没把编码还原就算了 还原了就算运气好!后来到PKAV经过二哥和短短的调教后才算是弄清楚了一点编码与

关于字符编码的那些事儿

字符编码其实没有几种,它只是一个标准,但是如果没有特别的去了解过的话,也是很容易被搞糊涂的. 今日随意翻了一下,稍微了解了一点,隧记录下来. #1 现代浏览器默认的字符集是 ISO-8859-1,如果不是则需要在 <meta> 部分进行指定.   #2 Unicode 标准:涵盖了世界上所有的字符.标点和符号.   #3 Unicode 的应用范围: XML.Java.ECMAScript(JavaScript).LDAP.CORBA3.0.WML.   #4 UTF-8 和 UTF-16是U

字符编码这个事儿

计算机中的编码和解码 计算中信息的表示是通过二进制01字节流.编码方式即为不同的二进制通过转换所表示出来的特定信息(不同的编码方式均有特定的规则) 符号集:ASCII只可表示128个符号.其他的文字符号ASCII无法表示.Unicode为其中一种字符集,该字符集包含了世界上所有的符号. Unicode规定了符号的二进制格式,但是没有固定编码格式(二进制格式如何存储).于是UTF-8,UTF-32等等编码方式都是具体Unciode符号的存储方式. 乱码的根因形成:编码和解码方式的不同,且编码和解码

精述字符编码(读这篇绝对不够)

带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BOM,BMP,Littile Endian,Big Endian,内码,外码,CodePage. 1.导语 字符编码(Character Encoding)是计算机显示文本的基础,是每一位IT从业者必知的计算机基础知识点,如同数值在计算中如何存储表示,那么基础,那么重要.然因字符编码历史久远,变更频繁,地域差

python字符编码

1. 字符编码简介 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符 ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符) 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 阶段二:为了满足中文,中国人定制了GBK GBK:2Bytes代表一个字符 为了满

刨根究底字符编码之十二——UTF-8究竟是怎么编码的

UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种编码方式(CEF),其特点是使用变长字节数(即变长码元序列.变宽码元序列)来编码.一般是1到4个字节,当然,也可以更长. 为什么要变长呢?这可以理解为按需分配,比如一个字节足以容纳所有的ASCII码字符,那何必补一堆0用更多的字节来存储呢? 实际上变长编码有其优势也有其劣势,优势是节省空间.自动纠错性能好.利于传输.扩展性强,劣势是不利于程序内部处理,比如正则表达式检索:而UTF-32这样等长码元序列(即等宽码元序列)的

Windows程序员必须知道的字符编码和字符集

 字符编码 (Character encoding) 在存储和传递文本过程中,为了使得所有电脑都能够正确的识别出文本内容,需要有一个统一的规则. 2. 字符集 (Character Set) ) 一般情况,一种编码方式对应一种字符集.如 ASCII,对应 ASCII 字符集.GBK 编码方式对应 GBK 字符集.但是也有一种编码方式,多种字符集的,Unicode 字符集有多种编码方式,如 utf-8,utf-16 等.  3.  ASCII ASCII(American Standard Cod

Python学习Day2笔记(字符编码)

1.字符编码 #ASCII码里只能存英文和特殊字符 不能存中文 存英文占1个字节 8位#中文编码为GBK 操作系统编码也为GBK#为了统一存储中文和英文和其他语言文字出现了万国码Unicode 所有一个字符都占2个字节 16位#英文文档改为Unicode编码大小变大一倍 为解决这种浪费空间问题#出现了Unicode扩展集 Utf-8 为可变长的字符编码 默认英文字符按ASCII码存储 中文按照3个字节存储 编码都要先decode成unicode再转码成目标编码 #获取默认编码import sys

字符编码集

•ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统.我们知道英文中经常使用的字符.数字符号被计算机处理时都是以二进制码的形式出现的.这种二进制码的集合就是所谓的ASCII码.每一个ASCII码与一个8位(bit)二进制数对应.其最高位是0,相应的十进制数是0-127.如,数字“0”的编码用十进制数表示就是48.另有128个扩展的ASCII码,最高位都是1,由一些制表符和