当前位置: 首页 > 后端技术 > PHP

关于Unicode,字符集,字符编码,每个程序员都应该知道的

时间:2023-03-30 01:58:32 PHP

基本概念字符[character]字符表示字母表中的字符,标点符号和其他符号。在计算机中,文本由字符组成。字符集[characterset]由一组特定用途的字符组成,如支持西欧语言的字符集,支持中文的字符集等。字符集只定义了符号及其语义,与计算机没有直接关系。在现实生活中,不同的语系都有自己的字符集,比如藏文有自己的字符集,汉语有自己的字符集。在计算机的世界里,也有各种各样的字符集,如ASCII字符集、GB2312字符集、GBK字符集等。还有一个其他字符集的超集——Unicode字符集定义了几乎大多数现有语言所需的字符。是一个支持多语言环境的通用字符集(可以同时处理多种语言的混合)。各个国家和地区在制定编码标准时,一般会同时制定“字符集”和“字符编码”。所以和ASCII字符集一样,它也代表了一种字符编码。字符编码[characterencoding]是一组规则,定义了如何在计算机内存中表示字符。是字符集中每个字符与计算机内存中的字节之间的转换关系。每个“字符”以一个字节或多个字节存储,使用哪些字节存储。比如ASCII编码【你没有看错,它不仅是字符集,还是字符编码】,它定义了英文字母和符号在计算机中的表示方式,用一个字节来表示。Unicode字符集有多种字符编码方式,如UTF8、UTF16等变长编码方式。汉字集还有很多字符编码,比如上面提到的GB2312编码和GBK编码。知乎这篇介绍字符编码、字体、iconv的文章很好,内容通俗易懂。还有一篇关于Unicode和字符集的知名文章:TheAbsoluteMinimumEverySoftwareDeveloperAbsolutely,PositivelyMustKnowAboutUnicodeandCharacterSets(NoExcuses!),网上有中文版。UCS和ISO10646标准ISO10646标准定义了通用字符集UCS[UniversalCharacterSet],它是所有其他字符集的超集。它保证与其他字符集之间的转换不会丢失信息。UCS不仅对每个字符进行编码,还定义了一个正式名称。用于表示一个UCS或Unicode的十六进制数通常以“U+”为前缀,例如“U+0041”用于表示拉丁文中的大写字母A。UCS[UniversalCharacterSet]和Unicode的关系可以简单粗暴的概括一下。它是由两组人制定的同一套标准。具体过程如下:20世纪80年代后期,两个独立的群体想要创建一个通用的字符集。一个是国际标准化组织ISO[InternationalOrganizationforStandardization],另一个是由联盟发起的Unicode项目,其初始成员多为美国多语言软件服务提供商。幸运的是,大约在1991年,两个项目的成员都意识到世界不需要两个统一的字符集。因此,他们共同开发了一个字符列表。虽然这两个项目今天仍然存在并独立发布自己的标准,但Unicode联盟和国际标准组织都同意使Unicode和ISO10646标准兼容,并将在未来密切合作。两者的区别,看这里什么是UTF8Unicode/UCS只是字符的集合。虽然每个字符都被分配了一个唯一的整数值,但是如何使用字节来表示每个字符是由字符编码决定的。.Unicode字符编码方式包括UTF-8、UTF-16、UTF-32。由于UTF-16和UTF-32编码包含对文件名和其他C语言库函数有特殊意义的“0”或“/”字符,不适合Unix和Unicode编码环境下的文件名和文本文件变量。UTF-8没有这样的问题,优点很多:可以向前兼容ASCII码,是变长编码,因为编码没有状态,容易重新同步,丢失一些字节后在传输过程中,它具有Stickiness。POSIX语言[locale]机制语言[locale]是软件运行时的语言环境,是语言和文化规则的集合,包括字符编码、日期/时间表示、字符排序规则等。语族名称通常由ISO639-1规定的语言[language]、ISO3166-1规定的国家代码[countrycode],以及附加的字符编码名称[characterencoding]组成,如zh_TW.UTF-8语族,zh表示语言为中文,TW表示台湾,UTF-8表示字符编码。在zh_CN.GBK中,CN是指中国大陆,用GBK编码。Linux下的语言家族由几类环境变量组成,这些环境变量指定与软件中的语言约定相关的行为信息。例如LC_CTYPE决定了字符编码方式,LC_COLLATE决定了字符排序规则。LANG环境变量用于为所有类设置默认语言,但LC_*变量可以覆盖每个单独的类。转载:https://blog.csdn.net/u013749...