开发必备基础知识【字符编码合集】
大家在日常开发交流中会发现,别人那里运行的好好的文件,在你电脑上却无法编译,甚至出现一堆莫名其妙的字符,比如:���
- 程序中经常遇到一些关于乱码的问题,而产生乱码的原因就是因为计算机直接存储字符时要把字符转为二进制,这其中不同的转换规则就对应不同的编码方式,所以要不出现乱码就必须编码方式和解码方式要保持一致。
ASCII:表示英文字母、数字、标点符号
是一种使用7个(能表示128个字符)或8个(能表示256个字符,ASCII扩展)二进制位进行编码的方案(美国信息交换标准(代)码),最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值,ASCII码正是最早用来将128字符的编码到计算机里面的一套编码
- 简介:ASCII是最基本的字符编码标准,它使用7位二进制数来表示128种可能的字符,包括英文大小写字母、数字、标点符号和一些控制字符。
- 特点:由于只支持128个字符,不包含任何非英语字符,如中文、日文等。
ISO8859-1(latin-1或西欧语言):在ASCII基础上支持编码拉丁字符
ISO8859-1:又称latin-1或“西欧语言”,是国际标准化组织内iso/iec,是ASCII的扩充,可以编码一些较为生僻的拉丁字符。
- 简介:ISO8859-1是ISO Latin-1字符集的实现,使用8位编码,扩展了ASCII,额外提供了128个字符,主要用于西欧语言。
- 特点:虽然比ASCII范围大,但同样不支持中文等多字节字符。
GB2312(属于ANSI):支持简体中文
GB2312也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,当计算机来到中国ISO8859-1就不够用了,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码,几乎所有的中文系统和国际化的软件都支持GB2312。
- 简介:GB2312是中国国家标准简体中文字符集,使用双字节编码,涵盖了6763个常用汉字及一些其他字符。
- 特点:专为中国大陆设计,支持简体汉字,但不包括繁体字和大量生僻字。
ANSI:泛指遵循ISO标准的字符集
在不同的上下文中,“ANSI”编码可能有不同的含义。通常在中国大陆,人们提到“ANSI编码”时,实际上指的是GB2312或其后续版本GBK的Windows编码。但在更广泛的意义上,ANSI指代遵循ISO标准的字符集,不特指某一套编码。
GBK:支持简体、繁体中文
GB2312的扩充,把BIG5码的思想融入进来,既可以表示简体中文也可以表示繁体中文,
GBK采用双字节表示。
- 简介:GBK是对GB2312的扩展,兼容GB2312,增加了对繁体字的支持和其他字符,总共收录了超过2万多个字符。
- 特点:支持简繁体汉字,适用范围更广。GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。
GB18030:支持简体、繁体、少数名族语言(国标码)
- 简介:GB18030是中国最新的汉字编码国家标准,兼容GBK,并进一步扩展字符集,支持更多的少数民族文字和CJK统一汉字(中日韩统一表意文字),总字符数超过7万个。
- CJK:代表“中日韩”(Chinese, Japanese, Korean),是指这三个语言共享的一套汉字和其他字符的集合。CJK字符在Unicode中被组织在一起,主要是为了统一编码这些语言中共同使用的汉字,减少编码上的重复。- 特点:全面覆盖了Unicode的字符集,是目前最全面的中文编码标准。
BIG5(大五码):台湾厂商制定的繁体中文编码
- 简介:BIG5是一种主要为繁体中文设计的传统字符编码方案,广泛应用于台湾和香港地区。它使用双字节编码,第一个字节的范围是0x81至0xFE,第二个字节的范围是0x40至0x7E以及0xA1至0xFE,总共可以表示约13053个字符,包括繁体汉字、标点符号、希腊字母、日文片假名等。
- 特点:BIG5并不支持简体中文字符,且与其他编码系统如GBK或GB18030不兼容。
Unicode:字符编码规范(统一全球编码),比ANSI更全面
- Unicode与ANSI关系:
- 历史背景:在Unicode出现之前,ANSI编码作为地区性编码标准广泛应用于不同国家和地区,用于满足特定语言环境下的字符表示需求。Unicode则是在全球化交流需求增加的背景下,为了解决不同编码系统间的兼容性问题而发展起来的统一字符编码标准。
- 过渡:随着Unicode的普及,许多系统和应用程序逐渐从使用地区性的ANSI编码转向支持Unicode,以更好地处理国际化的文本数据。在某些情况下,ANSI编码可能被视为Unicode的一个子集或特例,尤其是在指代Windows系统中与本地语言相关的编码时(如简体中文的GBK、繁体中文的BIG5等)
- 区别:
- 编码范围:ANSI编码(实际上是各个地区的特定编码,如GBK、BIG5等)通常只能覆盖有限的语言字符集,每个地区或语言的编码标准不同,而Unicode旨在涵盖地球上所有已知字符,包括各种语言、符号、表情等,拥有超过137,000个字符的位置。
- 字符表示:ANSI编码大多采用单字节或双字节混合的方式,而Unicode最原始的形式(UCS-2)使用固定两字节表示一个字符,后来的Unicode版本(UTF-16)在基本多语言平面上也是两字节,但扩展字符则需要四字节。UTF-8,作为Unicode的一种实现,使用可变长度编码,从1到4个字节不等。
- 国际化支持:Unicode由于其广泛的字符覆盖范围,天然支持多语言环境,解决了不同语言文本混排时的编码问题。而ANSI编码因地区而异,不便于跨语言环境的信息交换。
- 兼容性:ANSI编码与ASCII编码在低字节范围内兼容,但不同ANSI编码间不兼容。Unicode则提供了全球统一的字符映射,提高了跨平台和跨系统的文本兼容性。
UTF-8:Unicode的实现(根据字符不同实现可变长编码)
- 简洁:UTF-8是Unicode字符集的一种可变长度字符编码方式,是最常用的Unicode实现方式之一,特别是在互联网上。
- 特点:UTF-8 支持全球几乎所有语言和符号的编码,UTF-8使用1到4个字节来表示一个字符,根据字符的不同,其字节数也随之变化。对于ASCII字符(U+0000至U+007F),UTF-8使用单字节编码,与ASCII编码兼容。这种设计使得UTF-8既高效又兼容性好,适用于存储和传输多语言文本数据。【UTF-8一个英文字符占用一个字节的存储空间,一个中文(含繁体)占用三个字节的存储空间】
- 拓展utf8mb4:大家在MySQL建表时,会发现有一个utf8mb4编码,这其实是MySQL数据库中对UTF-8编码的一个特定支持形式,主要目的是为了完全支持存储四字节的Unicode字符,特别是包括表情符号(Emoji)在内的补充字符