Java中的字符集编码入门(一)Unicode与UCS的历史恩怨
java编码
基础概念
字符 字符集(character set)
字符的集合 定义码点与字符的映射关系 例:unicode(统一码),gb2312,ascii等
码点(code point) 码元(code unit) 编码(encoding)
定义码元(code unit)与码点的关系 在unicode之前,其实字符集与编码是确定的,就是说码元与码点是一致的,直到出现了unicode编码后,才有了字符集与编码的概念 字符集与编码关系:
单字节符号:字节第一位设为0,后面7位与unicode码相同,与ASCII码相同。 对于N字节符号(N>1):第一个字节前N位设置为1,第N+1位设置为0,后面字节的前
两位一律为10,剩下的没有提及的二进制位,全是这个符号的unicode码。
编码规则:
UTF-8与unicode的转化
以汉字“严”为例(Unicode->UTF-8):
UNICODE码(统一码)
1990年研发,1994年公布。 只是一个字符集(码表),不是一种编码,比如utf8是unicode的一种编码。 规定了符号的二进制代码,却没有规定如何存储。
UTF-8编码(Unicode Transfer Format)
是一种变长编码,使用1-4字节表示一个符号。 是ASCII的超集,兼容ASCII(使用一字节表示)。 编码规则:
String str = "中国人严";
for(int i = 0; i < str.length();i++) { char c = str.charAt(i); sb.append("\\u" + Integer.toHexString(c));
Java中文乱码问题产生原因分析
Java中文乱码问题产生原因分析在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。
对于我们所看到的字符,也是以二进制数据的形式存在的。
不同字符对应二进制数的规则,就是字符的编码。
字符编码的集合称为字符集。
17.1.1 常用字符集在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。
然而实际上,表示这些字符,只使用了1个字节的7位,这就是ASCII编码。
1.ASCIIASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。
每一个ASCII码与一个8位(bit)二进制数对应。
其最高位是0,相应的十进制数是0~127。
例如,数字字符“0”的编码用十进制数表示就是48。
另有128个扩展的ASCII码,最高位都是1,由一些图形和画线符号组成。
ASCII是现今最通用的单字节编码系统。
ASCII用一个字节来表示字符,最多能够表示256种字符。
随着计算机的普及,许多国家都将本地的语言符号引入到计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。
2.ISO8859-1因为ASCII码中缺少£、ü和许多书写其他语言所需的字符,为此,可以通过指定128以后的字符来扩展ASCII码。
国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和地区需要的字符。
其中最常用的是ISO8859-1,通常叫做Latin-1。
Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII码相同。
ISO 8859另外定义了14个适用于不同文字的字符集(8859-2到8859-15)。
Unicode字符全集
摩尔斯电码摩尔斯电码(又译为摩斯电码)是一种时通时断的信号代码,这种信号代码通过不同的排列顺序来表达不同的英文字母、数字和标点符号等。
它由美国人艾尔菲德·维尔发明。
艾尔菲德·维尔构思了一个方案,通过点、划和中间的停顿,可以让每个字元和标点符号彼此独立地发送出去。
作为一种信息编码标准,摩尔斯电码拥有其他编码方案无法超越的长久的生命。
摩尔斯电码在海事通讯中被作为国际标准一直使用到1999年。
1997年,当法国海军停止使用摩尔斯电码时,发送的最后一条消息是:“所有人注意,这是我们在永远沉寂之前最后的一声呐喊!”数字ASCII美国信息交换标准码(ASCII:American Standard Code for Information Interchange)起始于50年代后期,并最终在1967年定案。
最终的代码有26个小写字母,26个大写字母,10个数字,32个符号,33个控制代码和一个空格。
ASCII是一个真正的美国标准,所以他不能很好的满足其他将英语的国家的需要。
例如英国的英镑符号(£)就没有。
解决方案为代码页。
在小型机开发初期,就已经严格建立了8位字节。
因此,如果使用一个字节来保存字符,则可以由128个附加的字符来补充。
最低的128个代码总是相同的,较高的128个代码则取决于定义代码页的语言。
如果用户为PC键盘,显示卡,和打印机指定了一个代码页,然后在PC上创建、编辑和打印文档,一切都很正常,每件事都会保持一致。
然而,如果用户试图与使用不同代码页的用户交换文件,就会产生问题。
当然,应用程序可以通过将代码页信息与文档一起保存的方式来解决问题,但是且慢,更糟的事情还在后头。
在中国、日本和韩国的象形文字符号大约有21000个,如何容纳这些语言而仍保持和ASCII的某种兼容性呢。
解决方案为双字节字符集双字节字符集(DBCS:double-byte character set)与其他代码页一样,最初的128个代码是ASCII,较高的128个代码中的某些总是跟随者第二个字节(称作首字节和跟随字节)。
字符编码的发展历史节点
字符编码的发展历史节点字符编码是计算机系统中用来表示和存储字符的方式,它随着计算机技术的发展出现了许多不同的历史节点。
1. ASCII编码:ASCII(American Standard Code for Information Interchange)是最早的字符编码标准。
它使用7个比特位(后来扩展至8个比特位)来表示128个不同的字符,包括英文字母、数字以及常见的特殊字符。
ASCII编码在1963年被正式推出,成为了现代字符编码的基础。
2. ISO-8859编码:随着计算机在全球范围内的普及,美国的ASCII编码无法满足其他语言的需要。
因此,国际标准化组织(ISO)推出了ISO-8859系列编码,以满足不同国家和地区的字符需求。
其中,ISO-8859-1编码是欧洲字符的标准编码。
3. Unicode编码:随着计算机技术的飞速发展,需要一种统一的编码方案来表示所有字符。
Unicode应运而生,它提供了全球统一的字符编码方案。
Unicode编码使用16位比特位(后来扩展至32位)来表示每个字符,可包含几乎所有的语言和符号。
Unicode编码在1991年首次发布,目前广泛应用于各种操作系统和软件。
4. UTF-8编码:为了减少存储空间的占用和传输带宽的消耗,出现了一种可变长度的Unicode编码方案,即UTF-8编码。
UTF-8编码是一种向后兼容的编码方式,它可以表示任意Unicode字符,但只使用1至4个字节来编码字符,大多数常用字符只使用1至2个字节。
UTF-8编码是互联网上最常用的字符编码之一。
5. GB18030编码:由于Unicode编码包含了全球范围内的字符,对于中国汉字的表示,GB2312编码已经无法满足需求。
因此,在2000年,中国制定了新的编码标准GB18030,它是对Unicode的扩展,能够准确表示所有的汉字和其他字符。
综上所述,字符编码的发展历史经历了ASCII编码、ISO-8859编码、Unicode编码、UTF-8编码和GB18030编码等多个重要节点,每个节点都在不同程度上解决了字符表示和存储的需求。
Unicode,GBK,GB2312,UTF-8概念基础(转载)
Unicode,GBK,GB2312,UTF-8概念基础(转载)第⼀篇:JAVA字符编码系列⼀:Unicode,GBK,GB2312,UTF-8概念基础本部分采⽤重⽤,转载⼀篇⽂章来完成这部分的⽬标。
来源:holen'blog 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解地址:/holen/archive/2004/11/30/188182.aspxUnicode:制定的编码机制, 要将全世界常⽤⽂字都函括进去.在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应⼀个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平⾯, 另外增加了16个位平⾯, 相当于20位编码, 编码范围0到0x10FFFF.UCS:ISO制定的ISO10646标准所定义的 Universal Character Set, 采⽤4byte编码.Unicode与UCS的关系:ISO与是两个不同的组织, 因此最初制定了不同的标准; 但⾃从unicode2.0开始, unicode采⽤了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持⼀致.UCS的编码⽅式:UCS-2, 与unicode的2byte编码基本⼀样.UCS-4, 4byte编码, ⽬前是在UCS-2前加上2个全零的byte.UTF: Unicode/UCS Transformation FormatUTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:* 与CPU字节顺序⽆关, 可以在不同平台之间交流* 容错能⼒⾼, 任何⼀个字节损坏后, 最多只会导致⼀个编码码位损失, 不会链锁错误(如GB码错⼀个字节就会整⾏乱码)UTF-16, 16bit编码, 是变长码, ⼤致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为⽹络传输的外码.UTF-16是unicode的preferred encoding.UTF-32, 仅使⽤了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的⼦集.UTF与unicode的关系:Unicode是⼀个字符集, 可以看作为内码.⽽UTF是⼀种编码⽅式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第⼀个byte都是0x00, 在操作系统(C语⾔)中有特殊意义, 会引起问题. 采⽤UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来⼀些优点.中国国标编码:GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改⽽同步更改.GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统⼀汉字部分, 并且增加了部分unicode中没有的字符.GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是⼀种unicode编码形式. 变长编码, ⽤单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK.GB 18030是中国所有⾮⼿持/嵌⼊式计算机系统的强制实施标准.-------------------------------什么是 UCS 和 ISO 10646?国际标准 ISO 10646 定义了通⽤字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的⼀个超集. 它保证与其他字符集是双向兼容的.就是说, 如果你将任何⽂本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.UCS 包含了⽤于表达所有已知语⾔的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中⽂, ⽇⽂和韩⽂这样的象形⽂字, 以及平假名, ⽚假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰⽶尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, ⽼挝语, 汉语拼⾳(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加⼊的语⾔, 由于正在研究怎样在计算机中最好地编码它们, 因⽽最终它们都将被加⼊. 这些语⾔包括 Tibetian, ⾼棉语, Runic(古代北欧⽂字), 埃塞俄⽐亚语, 其他象形⽂字, 以及各种各样的印-欧语系的语⾔, 还包括挑选出来的艺术语⾔⽐如 Tengwar, Cirth 和克林贡语(Klingon). UCS 还包括⼤量的图形的, 印刷⽤的, 数学⽤的和科学⽤的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.ISO 10646 定义了⼀个 31 位的字符集. 然⽽, 在这巨⼤的编码空间中, 迄今为⽌只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位⼦集称为基本多语⾔⾯ (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于⾮常特殊的字符(⽐如象形⽂字), 且只有专家在历史和科学领域⾥才会⽤到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的21 位的编码空间以外去了. ISO 10646-1 标准第⼀次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第⼆部分 ISO 10646-2 正在准备中, 但也许要过好⼏年才能完成. 新的字符仍源源不断地加⼊到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.UCS 不仅给每个字符分配⼀个代码, ⽽且赋予了⼀个正式的名字. 表⽰⼀个 UCS 或 Unicode 值的⼗六进制数, 通常在前⾯加上 "U+", 就象 U+0041 代表字符"拉丁⼤写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是⼀致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是⼀致的. 从U+E000 到 U+F8FF, 已经 BMP 以外的⼤范围的编码是为私⽤保留的.什么是组合字符?UCS⾥有些编码点分配给了组合字符.它们类似于打字机上的⽆间隔重⾳键. 单个的组合字符不是⼀个完整的字符. 它是⼀个类似于重⾳符或其他指⽰标记, 加在前⼀个字符后⾯. 因⽽, 重⾳符可以加在任何字符后⾯. 那些最重要的被加重的字符, 就象普通语⾔的正字法(orthographies of common languages)⾥⽤到的那种, 在 UCS ⾥都有⾃⼰的位置, 以确保同⽼的字符集的向后兼容性. 既有⾃⼰的编码位置, ⼜可以表⽰为⼀个普通字符跟随⼀个组合字符的被加重字符, 被称为预作字符(precomposed characters). UCS ⾥的预作字符是为了同没有预作字符的旧编码, ⽐如 ISO 8859, 保持向后兼容性⽽设的. 组合字符机制允许在任何字符后加上重⾳符或其他指⽰标记, 这在科学符号中特别有⽤, ⽐如数学⽅程式和国际⾳标字母, 可能会需要在⼀个基本字符后组合上⼀个或多个指⽰标记.组合字符跟随着被修饰的字符. ⽐如, 德语中的元⾳变⾳字符 ("拉丁⼤写字母A 加上分⾳符"), 既可以表⽰为 UCS 码 U+00C4 的预作字符, 也可以表⽰成⼀个普通 "拉丁⼤写字母A" 跟着⼀个"组合分⾳符":U+0041 U+0308 这样的组合. 当需要堆叠多个重⾳符, 或在⼀个基本字符的上⾯和下⾯都要加上组合标记时, 可以使⽤多个组合字符. ⽐如在泰国⽂中, ⼀个基本字符最多可加上两个组合字符.什么是 UCS 实现级别?不是所有的系统都需要⽀持象组合字符这样的 UCS ⾥所有的先进机制. 因此 ISO 10646 指定了下列三种实现级别:级别1不⽀持组合字符和 Hangul Jamo 字符 (⼀种特别的, 更加复杂的韩国⽂的编码, 使⽤两个或三个⼦字符来编码⼀个韩⽂⾳节)级别2类似于级别1, 但在某些⽂字中, 允许⼀列固定的组合字符 (例如, 希伯来⽂, 阿拉伯⽂, Devangari, 孟加拉语, 果鲁穆奇语, Gujarati, Oriya, 泰⽶尔语, Telugo, 印.埃纳德语, Malayalam, 泰国语和⽼挝语). 如果没有这最起码的⼏个组合字符, UCS 就不能完整地表达这些语⾔.级别3⽀持所有的 UCS 字符, 例如数学家可以在任意⼀个字符上加上⼀个 tilde(颚化符号,西班⽛语字母上⾯的~)或⼀个箭头(或两者都加).什么是 Unicode?历史上, 有两个独⽴的, 创⽴单⼀字符集的尝试. ⼀个是国际标准化组织(ISO)的 ISO 10646 项⽬, 另⼀个是由(⼀开始⼤多是美国的)多语⾔软件制造商组成的协会组织的 Unicode 项⽬. 幸运的是, 1991年前后, 两个项⽬的参与者都认识到, 世界不需要两个不同的单⼀字符集. 它们合并双⽅的⼯作成果, 并为创⽴⼀个单⼀编码表⽽协同⼯作. 两个项⽬仍都存在并独⽴地公布各⾃的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.那么 Unicode 和 ISO 10646 不同在什么地⽅?Unicode 协会公布的 Unicode 标准严密地包含了 ISO 10646-1 实现级别3的基本多语⾔⾯. 在两个标准⾥所有的字符都在相同的位置并且有相同的名字.Unicode 标准额外定义了许多与字符有关的语义符号学, ⼀般⽽⾔是对于实现⾼质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语⾔(⽐如阿拉伯语)表达形式的算法, 处理双向⽂字(⽐如拉丁与希伯来⽂混合⽂字)的算法和排序与字符串⽐较所需的算法, 以及其他许多东西.另⼀⽅⾯, ISO 10646 标准, 就象⼴为⼈知的 ISO 8859 标准⼀样, 只不过是⼀个简单的字符集表. 它指定了⼀些与标准有关的术语, 定义了⼀些编码的别名, 并包括了规范说明, 指定了怎样使⽤ UCS 连接其他 ISO 标准的实现, ⽐如 ISO 6429 和 ISO 2022. 还有⼀些与 ISO 紧密相关的, ⽐如 ISO 14651 是关于 UCS 字符串排序的.考虑到 Unicode 标准有⼀个易记的名字, 且在任何好的书店⾥的 Addison-Wesley ⾥有, 只花费 ISO 版本的⼀⼩部分, 且包括更多的辅助信息, 因⽽它成为使⽤⼴泛得多的参考也就不⾜为奇了. 然⽽, ⼀般认为, ⽤于打印 ISO 10646-1 标准的字体在某些⽅⾯的质量要⾼于⽤于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但⼀些提供的样例字形有显著的区别. ISO 10646-1 标准同样使⽤四种不同的风格变体来显⽰表意⽂字如中⽂, ⽇⽂和韩⽂ (CJK), ⽽ Unicode 2.0 的表⾥只有中⽂的变体. 这导致了普遍的认为 Unicode 对⽇本⽤户来说是不可接收的传说, 尽管是错误的.什么是 UTF-8?⾸先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好⼏种将⼀串字符表⽰为⼀串字节的⽅法. 最显⽽易见的两种⽅法是将 Unicode ⽂本存储为 2 个或 4 个字节序列的串. 这两种⽅法的正式名称分别为 UCS-2 和 UCS-4. 除⾮另外指定, 否则⼤多数的字节都是这样的(Bigendian convention). 将⼀个 ASCII 或 Latin-1 的⽂件转换成 UCS-2 只需简单地在每个 ASCII 字节前插⼊ 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插⼊三个 0x00.在 Unix 下使⽤ UCS-2 (或 UCS-4) 会导致⾮常严重的问题. ⽤这些编码的字符串会包含⼀些特殊的字符, ⽐如 '/0' 或 '/', 它们在⽂件名和其他 C 库函数参数⾥都有特别的含义. 另外, ⼤多数使⽤ ASCII ⽂件的 UNIX 下的⼯具, 如果不进⾏重⼤修改是⽆法读取 16 位的字符的. 基于这些原因, 在⽂件名, ⽂本⽂件, 环境变量等地⽅, UCS-2 不适合作为 Unicode 的外部编码.在 ISO 10646-1 Annex R 和 RFC 2279 ⾥定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使⽤ Unicode 的明显的⽅法.UTF-8 有⼀下特性:UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的⽂件在 ASCII 和 UTF-8 两种编码⽅式下是⼀样的.所有 >U+007F 的 UCS 字符被编码为⼀个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的⼀部分.表⽰⾮ ASCII 字符的多字节串的第⼀个字节总是在 0xC0 到 0xFD 的范围⾥, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到0xBF 范围⾥. 这使得重新同步⾮常容易, 并使编码⽆国界, 且很少受丢失字节的影响.可以编⼊所有可能的 231个 UCS 代码UTF-8 编码字符理论上可以最多到 6 个字节长, 然⽽ 16 位 BMP 字符最多只⽤到 3 字节长.Bigendian UCS-4 字节串的排列顺序是预定的.字节 0xFE 和 0xFF 在 UTF-8 编码中从未⽤到.下列字节串⽤来表⽰⼀个字符. ⽤到哪个串取决于该字符在 Unicode 中的序号.U-00000000 - U-0000007F: 0xxxxxxxU-00000080 - U-000007FF: 110xxxxx 10xxxxxxU-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxxU-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxU-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxxxx 的位置由字符编码数的⼆进制表⽰的位填⼊. 越靠右的 x 具有越少的特殊意义. 只⽤最短的那个⾜够表达⼀个字符编码数的多字节串. 注意在多字节串中, 第⼀个字节的开头"1"的数⽬就是整个串中字节的数⽬.例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 ⾥的编码为:11000010 10101001 = 0xC2 0xA9⽽字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0这种编码的官⽅名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何⽂档中⽤其他名字 (⽐如 utf8 或 UTF_8) 来表⽰ UTF-8,当然除⾮你指的是⼀个变量名⽽不是这种编码本⾝.什么编程语⾔⽀持 Unicode?在⼤约 1993 年之后开发的⼤多数现代编程语⾔都有⼀个特别的数据类型, 叫做 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 ⽉ Amendment 1 to ISO C 发表时⼜加⼊了更多. 这些机制主要是为各类东亚编码⽽设计的, 它们⽐处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调⽤多字节字符串的编码的⼀个例⼦, wchar_t 类型可以⽤来存放Unicode 字符.---------------------作者:qinysong来源:CSDN原⽂:https:///qinysong/article/details/1179480版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!。
编码规则和字符集
编码规则和字符集是计算机中用于表示和处理文本数据的重要概念。
编码规则(Encoding)定义了如何将字符映射为计算机内部的二进制数据表示形式。
不同的编码规则采用不同的映射方式,可以表示不同范围的字符集。
字符集(Character Set)是一组字符的集合,它定义了一个编码规则所能表示的字符的范围。
常见的字符集包括ASCII、Unicode等。
下面是一些常见的编码规则和字符集:1. ASCII(American Standard Code for Information Interchange):ASCII是最早的字符集和编码规则之一,包含128个字符,用7位二进制数表示,包括英文字母、数字、标点符号等常见字符。
2. Unicode:Unicode是一种字符集,包含了全球范围内几乎所有的字符。
它用于表示各种语言文字、符号、表情符号等。
Unicode使用不同的编码规则,最常见的是UTF-8、UTF-16、UTF-32。
其中,UTF-8是较为常用的编码规则,使用1至4个字节表示一个字符,兼容ASCII 字符集。
3. UTF-8(Unicode Transformation Format-8):UTF-8是一种可变长度的Unicode编码规则。
它使用8位字节表示一个字符,能够表示Unicode字符集中的所有字符。
4. UTF-16(Unicode Transformation Format-16):UTF-16使用16位字节表示一个字符,能够表示Unicode字符集中所有的字符,包括较为罕见的字符。
除了上述编码规则和字符集,还有一些其它编码规则如GB2312、GBK、Big5等,它们主要用于表示中文字符集。
在处理文本数据时,需要明确所使用的编码规则和字符集,以确保正确地解码和显示文本内容。
如果编码规则和字符集不匹配,就可能导致乱码或无法正确显示文本。
因此,在处理文本数据时,应注意确认输入输出所使用的编码规则,并进行适当的编码和解码操作。
unicode和ansi字符集
Unicode :宽字节字符集1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2.如何对DBCS(双字节字符集)字符串进行操作?函数描述PTSTR CharNext (LPCTSTR ); 返回字符串中下一个字符的地址PTSTR CharPrev (LPCTSTR, LPCTSTR );返回字符串中上一个字符的地址BOOL IsDBCSLeadByte( BYTE );如果该字节是DBCS字符的第一个字节,则返回非0值3. 为什么要使用Unicode?(1)可以很容易地在不同语言之间进行数据交换。
(2)使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3)提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。
如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。
进行这些字符串的转换需要占用系统的时间和内存。
通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows 函数Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM 接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。
字符编码ascii、unicode、utf-8、gbk的关系
字符编码ascii、unicode、utf-8、gbk的关系
ASCII码:
计算机是美国⼈发明和最早使⽤的,他们为了解决计算机处理字符串的问题,就将数字字母和⼀些常⽤的符号做成了⼀套编码,这个编码就是ASCII码。
ASC码II包括数字⼤⼩写字母和常⽤符号,⼀共128个,1字节(Byte)=8bit,8bit能表⽰的最⼤数是256,所以ASIIC编码中⼀个字符的⼤⼩就是1Byte
Unicode编码:
计算机进⼊中国后,ASCII完全不够⽤,于是我们就制定了⾃⼰的GB2312编码,把汉字编码了进去。
类似的在各国都有相同的情况,各国都开始制定⾃⼰的⼀套编码,计算机的编码越来越庞⼤,越来越乱,为了解决这⼀问题,Unicode应运⽽⽣。
Unicode将各国⽂字统⼀编码,所以Unicode编码可以看做是ASCII的扩展。
特点:速度快,但是占内存⼤。
UTF-8:
UTF-8编码可以理解成Unicode编码的⼀种升级,为了节省存储空间。
UTF-8根据实际使⽤情况调节存储编码的位数,将所有的字符和符号进⾏分类:ASCII码中的内容⽤1个字节保存、欧洲的字符⽤2个字节保存,东亚的字符⽤3个字节保存等等
GBK:
GBK也是基于Unicode编码的进⼀步优化,GBK的⽂字编码是⽤双字节来表⽰的,即不论中、英⽂字符均使⽤双字节来表⽰。
注:
cmd终端默认GBK
unicode utf8 gbk(针对中⽂)
utf8: 3,⽤3个字节表⽰中⽂
gbk : 2,⽤2个字节表⽰中⽂。
Unicode UTF GBK 单字节 多字节
话说字符集李貌-- Fiberhome 摘要:本文简要陈述Unicode、USC、UTF、GBK、单字节、多字节的基本概念,并说明它们之间的联系与区别。
关于USC的编码对应关系、UTF的格式定义等细节,不在本文讨论范围内。
1.概念Unicode:是一种在计算机上使用的字符编码。
其中文称呼为统一码、万国码或单一码。
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
说明:这是概念,是抽象的东西;其通过USC与UTF的细化,真正实现跨语言、跨平台的特性。
USC:通用字符集,是Universal Character Set的缩写,是Unicode的编码标准。
说白了,就是字符与编码(数字)的对应关系的标准。
USC分为USC-2和USC-4。
简单的说,UCS-2用两个字节编码,UCS-4用4个字节编码。
显而易见,由于两字节编码只能存储2^16(65536)个字符,无法存储全球字符(即全球各国的字符总和大于2^16个),故产生UCS-4标准。
通常我们不区分Unicode与USC,即说UNICODE时也就是说UCS。
UTF:字符集转换(或者传输)格式,是UCS Transformation Format的缩写。
它定义了Unicode的编码(数字)转换成程序数据。
它是网络上不同国家不同操作系统进行字符串传输、交换的重要依据。
UTF 分为UTF-8、UTF-16、UTF-32。
UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位(传输过程中的最小单元)。
GBK:(汉语)国标字符集。
与USC一样,只是GBK是中国人自己为汉字进行编码而定义的统一字符集。
GBK是规范中文编码过程中的重要成果,是一项国家标准。
中文编码标准主要存在GB2312、GBK、GB18030三个版本。
GBK是windows中文操作系统缺省使用的字符集。
BIG-5:繁体中文码,是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
外因常用编码
外因常用编码
在编程和计算机领域中,外因常用编码是指用于表示字符和符号的编码系统。
以下是一些常见的外因常用编码:
1. ASCII(美国信息交换标准代码):ASCII编码是最早和最常见的字符编码之一,使用7位二进制数来表示128个不同的字符,包括字母、数字、标点符号和一些特殊控制字符。
2. Unicode(统一码):Unicode是一种用于表示世界上所有已知字符的编码系统,它为每个字符分配了一个唯一的数字码点。
Unicode采用不同的编码方案,其中最常见的是UTF-8、UTF-16和UTF-32。
3. UTF-8(Unicode转换格式-8位):UTF-8是一种可变长度的编码方案,用于表示Unicode字符。
它使用8位(1至4个字节)来表示不同的字符,能够表示几乎所有的Unicode字符,并且与ASCII编码兼容。
4. UTF-16(Unicode转换格式-16位):UTF-16也是一种可变长度的编码方案,使用16位(2或4个字节)来表示Unicode字符。
它可以表示所有的Unicode字符,但对于ASCII字符和大部分常用字符,使用2个字节表示。
5. UTF-32(Unicode转换格式-32位):UTF-32是一种固定长度的编码方案,使用32位(4个字节)来表示Unicode字符。
它可以表示所有的Unicode字符,每个字符都使用相同数量的字节。
这些是常见的外因常用编码系统,不同的编码系统适用于不同的应用场景和需求。
在进行字符处理、文本存储和网络通信时,选择合适的编码方式非常重要。
1。
#是什么编码unicode两种编码方式与中文的转换
#是什么编码unicode两种编码⽅式与中⽂的转换unicode的表⽰⽅式有两种,⼀种为web页⾯中使⽤的,⼀种为我们⼀般采⽤的编码⽅式第⼀种:"成都 "Unicode编码⽅式 &+编号是⽹页⾥引⽤unicode字符的⽅法,编号为⼗进制的在unicode中的编号第⼆种:\u6210\u90fd 表⽰的也是成都,采⽤的也是unicode编码格式,是java编程中使⽤的编码格式它以\u开头,后接四位16进制的数。
以下是java中之间相互转化的代码/** string与unicode之间相互转换*/import java.util.regex.Matcher;import java.util.regex.Pattern;public class unicodeString {public static void main(String[] args) {String str = "中国";System.out.println(unicodeString.StringToWebUnicode(str));System.out.println(unicodeString.WebUnicodeToString("中国"));System.out.println(unicodeString.StringToUnicode(str));System.out.println(unicodeString.UnicodeToString("\u4e2d\u56fd\\uqqqq"));}/** 普通类型的unicode转string*/public static String UnicodeToString(String input) {Pattern pattern = pile("(\\\\u(\\p{XDigit}{4}))");Matcher matcher = pattern.matcher(input);char ch;while (matcher.find()) {ch = (char) Integer.parseInt(matcher.group(2), 16);input = input.replace(matcher.group(1), ch + "");}return input;}/** string转普通类型的unicode*/public static String StringToUnicode(String input) {String str = "";for (char c : input.toCharArray()) {if ((int) c > 128)str += "\\u" + Integer.toHexString((int) c);elsestr += c;}return str;}/** string转web类型的unicode*/public static String StringToWebUnicode(String input) {String str = "";for (char c : input.toCharArray()) {str += "&#" + (int) c + ";";}return str;}/** web类型的unicode转string*/public static String WebUnicodeToString(String input) {String str = "";String[] y1 = input.split(";");for (String c : y1) {if (c.length() > 2) {str += (char) Integer.parseInt(c.substring(2));}}return str;}}js下将unicode转换为中⽂或字符串的代码<script>//带;号var str="最新發https://www.jb51.net/article/1.htm //不带分号var str2="https://www.jb51.net/article/1.htm";function uncode(str) {return str.replace(/&#(x)?([^&]{1,5});?/g, function (a, b, c) {return String.fromCharCode(parseInt(c, b ? 16 : 10));})}document.write(uncode(str));document.write("<br>");document.write(uncode(str2));</script>&#是什么编码在⽹页中以&#开头的是HTML实体,⼀些字符在 HTML 中是预留的,拥有特殊的含义,⽐如⼩于号‘<’⽤于定义 HTML 标签的开始。
字符编码发展历史
字符编码发展历史
字符编码是将字符映射为数字的过程,以便计算机可以处理和存储文本数据。
以下是字符编码的发展历史:
1. ASCII 编码:在计算机发展的早期,美国信息交换标准代码(ASCII)是最常用的字符编码标准。
ASCII 编码使用 7 位二进制数来表示 128 个字符,包括英文字母、数字、标点符号和一些特殊字符。
2. EBCDIC 编码:随着计算机在全球范围内的普及,ASCII 编码无法满足不同语言和字符集的需求。
因此,出现了扩展二进制编码十进制交换码(EBCDIC)编码,它是一种 8 位字符编码,可以表示更多的字符。
3. Unicode 编码:为了解决不同字符集之间的兼容性问题,Unicode 编码应运而生。
Unicode 是一种国际标准,旨在为全球各种语言和符号提供一个统一的字符编码方案。
Unicode 采用 16 位或 32 位编码,可以表示几乎所有的字符。
4. UTF-8 编码:UTF-8 是 Unicode 的一种变长编码方案,它使用 1 到 4 个字节来表示 Unicode 字符。
UTF-8 编码具有良好的兼容性和可扩展性,成为了互联网上最常用的字符编码标准。
随着计算机技术的不断发展和字符集的不断扩展,字符编码也在不断演进和完善。
目前,UTF-8 已经成为了事实上的字符编码标准,被广泛应用于各种计算机系统和应用程序中。
unicode编码规则
unicode编码规则【原创版】目录1.Unicode 编码规则简介2.Unicode 编码的基本原理3.Unicode 编码表的构成4.Unicode 编码的应用领域5.Unicode 编码的优点和局限性正文一、Unicode 编码规则简介Unicode 编码规则是一种用于表示各种语言字符的编码系统,由国际标准化组织(ISO)制定。
Unicode 编码规则旨在实现全球范围内各种文字的统一表示,以便在计算机系统中进行高效、准确的数据交换和处理。
二、Unicode 编码的基本原理Unicode 编码的基本原理是将世界上各种语言的字符都映射到一个统一的编码空间,这个空间包含了所有可打印字符、标点符号以及特殊字符等。
Unicode 编码使用一个字节(8 位)或两个字节(16 位)来表示一个字符,这使得它能够表示世界上几乎所有的字符集。
三、Unicode 编码表的构成Unicode 编码表包含了所有的 Unicode 字符及其对应的编码值。
Unicode 编码表的构成遵循一定的规律,如:字母、数字、标点符号等具有规律的编码范围。
Unicode 编码表按照字符的类型和用途进行分类,包括了常用字符、符号、特殊字符等。
四、Unicode 编码的应用领域Unicode 编码在众多领域得到了广泛应用,如:计算机编程、网页设计、文本处理、数据传输等。
Unicode 编码的出现解决了不同国家和地区字符编码的兼容性问题,使得全球范围内的信息交流变得更加便捷。
五、Unicode 编码的优点和局限性Unicode 编码的优点包括:统一表示全球范围内的字符,提高了字符编码的兼容性和通用性;节省了存储空间,提高了数据处理的效率;易于实现字符的输入、输出和转换。
然而,Unicode 编码也存在一定的局限性,如:对于一些特殊领域的字符集支持不足;编码值可能会受到限制,导致某些字符无法表示。
综上所述,Unicode 编码规则作为一种全球通用的字符编码体系,具有广泛的应用前景和重要的现实意义。
Java常见乱码原理及解决方案
Java常见乱码原理及解决方案String odsStr = "测试";String newStr = new String(odsStr.getBytes("GBK"), "ISO8859_1");首先需要说明一下我们经常用到的字符集,有ISO8859-1,GB2312,GBK,GB18030,UNICODE。
这里ISO8859-1字符集只包含英文字符,使用一个字节存储。
GB2312、GBK和GB18030字符集包含中文字符,他们都兼容ISO8859-1字符集,他们的字符存储格式是变长的,其中GB18030包含GBK,GBK包含GB2312。
UNICODE包含世界上所有国家的字符,UNICODE又分为UTF-8,UTF-16和UTF-32三种,UTF-8是变长字符集,它兼容ISO8859-1,即英文字符使用一个字节编码,而其他的字符使用2到4个字节编码,其中中文字符大部分都是使用3个字节进行编码,少量偏僻字使用4个字节编码,UTF-16统一都使用2个字节编码,它不兼容ISO8859-1,英文字符也使用两个字节,UTF-32统一使用4个字节编码,也不兼容ISO8859-1,可见UTF-16和UTF-32都比较浪费空间。
乱码问题的产生最根本的原因就是使用错误的字符集解码字节流或者将给定的字符串用错误的字符集编码成错误字节流造成的,例如”中文”两个汉字,如果用ISO8859-1字符集将其编码为字节流,因为这个字符集不支持中文,所以就会出错,输出结果为3f3f,其意义就是??。
再例如”中文”二字的GBK的字节流为d6 d0 ce c4,可是我们要是用不兼容的字符集去解码,例如用ISO8859-1或者UTF-8,这随后产生的字符串就是乱码,或者是其他的某个字符。
从开发Java程序到运行Java程序的过程中都存在着编码问题,所以要想避免乱码产生,就必须了解在其中任何时候的编码处理的情况。
unicode编码的原理。
unicode编码的原理。
Unicode是一种字符编码方案,它的原理是给每个字符分配一
个唯一的代码点(code point),并为这些代码点指定一个在
计算机中的标准表示方式。
每个字符对应的代码点是一个整数,可以用十六进制表示。
Unicode编码的目标是包含世界上所有的字符,无论是已知的
还是尚未发现的。
它将字符按照类别进行分组,例如拉丁字母、希腊字母、中文汉字等。
对于每一组字符,Unicode在整个代
码空间内为它们分配了连续的代码点。
Unicode编码可以使用不同的表示方式,其中最常见的是
UTF-8、UTF-16和UTF-32。
- UTF-8是一种可变长度编码方式,使用1到4个字节来表示
一个字符,根据字符所需要的位数来确定编码长度。
它的优点是可以兼容ASCII编码,节省存储空间。
- UTF-16是一种固定长度编码方式,使用2或4个字节来表示一个字符。
这种编码方式适用于大多数字符都使用2个字节表示的语言,如中日韩文字。
- UTF-32是一种固定长度编码方式,使用4个字节来表示一个字符。
它适用于需要处理所有Unicode字符的特殊应用场景。
通过使用Unicode编码,不同的计算机系统和软件可以在处理
多语言文本时达到互操作性,确保字符的正确显示和传输。
unicode和ascii的区别是什么
unicode和ascii的区别是什么什么是UnicodeUnicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
1990年开始研发,1994年正式公布。
Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。
很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。
作用能够使计算机实现跨语言、跨平台的文本转换及处理。
什么是ASCIIASCII(American Standard Code for InformaTIon Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
请注意,ASCII是American Standard Code for InformaTIon Interchange缩写,而不是ASC Ⅱ(罗马数字2),有很多人在这个地方产生误解。
产生计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
Java中编码以及Unicode总结
Java中编码以及Unicode总结1.基本概念●bit 位只能是0或者1●byte 字节一个字节是8位,1 byte=8 bits 计算机表示的基本单位●KB,MB,GB,TB,PB是以1024与byte进行换算●进制用符号进行计数十进制、二进制、八进制(011)、十六进制(0xFF)字符文字和符号的总称●字符集多个字符集合的总称。
ASCII字符集、GB2312字符集、GBK字符集、BIG5字符集、GB18003字符集、Unicode字符集●byte可表示2^8=256个字符的表示0 0×00 0000,00001 0×01 0000,00012 0×01 0000,0010127 0×7F 0111,1111-128 0×80 1000,0000-2 0xFE 1111,1110-1 0xFF 1111,1111●以补码的形式表示的二进制编码。
-2的表示,2=0000,0010,反码1111,1101,补码=反码+1=111111101111,1110表示的就是1111,1110-1=1111,1101,取反就是0000,0010也就是2,所以就是-22.字符集和编码2.1.字符(Character)字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。
2.2.字符集(Character Set)一组抽象字符的集合就是字符集(Character Set)。
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。
一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。
字符集的子集也是字符集。
计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。
Unicode字符集(简称为UCS)
Unicode字符集(简称为UCS)1.名称的由来Set)通用多八位编码字符集的简称,支持世界上超过650种语言的国际字符集。
Unicode允许在同一服务器上混合使用不同语言组的不同语言。
它是由一个名为Unicode 学术学会(Unicode Consortium)的交换、处理及显示。
该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。
Unicode是一理的要求。
2.编码方法缀“U+”,例如字母“A”的编码为004116 。
所以“A”的编码书写为“U+0041”。
3.UTF-8 编码UTF-8是Unicode的其中一个使用方式。
UTF是Unicode Translation Format,即把Unicode转做某种格式的意思。
UTF-8使用可变长度字节来储存Unicode字符,例如ASCII字母继4.UTF-16 和UTF-32 编码编码方案,UTF-16 使用一个或两个未分配的16 位代码单元的序列对Unicode 代码点进行编码;UTF-32 即将每一个Unicode 代码点表示为相同值的32 位整数通过一个问题了解unicode编码Unicode big endian和UTF-8这几种编码方式间相互转换。
同样是txt文件,Windows怎样识别编码方式的呢?我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt 文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF (Unicode big endian),EF、BB、BF(UTF-8)。
但这些标记是基于什么标准呢?答案:ANSI字符集定义:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。
UNICODE 与UTF8、UTF16由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。
UNICODE与ASCII码的关系
ASCII:8bits的英文编码,实际使用低7位,127个字符。
32(0x20)为空格,之前是控制字符,之后是有效字符。
Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16 =65536)。
Unicode little endian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。
如:把字符”0xFEFF”存为FFEF的格式。
Unicode big endian:Unicode字符编码以正序存储。
一、之间的关系:UCS2码是用两个字节表示一个字符,如果字符是ASCII码中的字符,则一个字节为空(值为0),另一个字节为原ASCII码中的值。
如:ASCII中的a,用UCS2表示为0a或a0。
所以UCS2字符中的两个字节有个字节顺序问题,0a为大端,a0为小端。
因此,在把UCS2字符转换成其它字符时,要先清楚字节顺序。
二、MTK 中的类型定义:U8 ——UINT8,unsigned charU16 ——UINT16,unsigned shortU32 ——UINT32,unsigned longS8 ——SINT8,charS16 —— SINT16, shortS32 —— SINT32, long三、ASCII与UCS2转换:在MTK中有专门的转换函数如:mmi_asc_to_ucs2(S8* pOutbuffer, S8* pInputbuffer);假设现有一ASCII数组:char asc_str[20];如果转为U8则需声明UCS2的数组大小为ASCII数组大小的两倍,U8 ucs_u8_str[40];如果转为U16则声明的UCS2数组大小可以和ASCII数组大小一样,U16 ucs_u16_str[20];因为UCS2是用两个字节表示ASCII中的一个字节的,所以如果声明为U8 ucs_u8_str[20];的话,会使的转换结果溢出。
常用编码详解
常用编码详解关键字:UCS,BMP,Unicode,GB2312,UTF-8,UTF7,编码摘要:本文在对各种资料整理后详细介绍各种常见编码的转换算法。
一、通用字符集(UCS)ISO/IEC 10646-1 [ISO-10646]定义了一种多于8比特字节的字符集,称作通用字符集(UCS),它包含了世界上大多数可书写的字符系统。
已定义了两种多8比特字节编码,对每一个字符采用四个8比特字节编码的称为UCS-4,对每一个字符采用两个8比特字节编码的称为UCS-2。
它们仅能够对UCS的前64K字符进行编址,超出此范围的其它部分当前还没有分配编址。
二、基本多语言面(BMP)ISO 10646 定义了一个31位的字符集。
然而,在这巨大的编码空间中,迄今为止只分配了前65534个码位 (0x0000 到 0xFFFD)。
这个UCS的16位子集称为“基本多语言面”(Basic Multilingual Plane, BMP)。
三、Unicode编码历史上,有两个独立的,创立单一字符集的尝试。
一个是国际标准化组织(ISO)的 ISO 10646 项目;另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的Unicode 项目。
幸运的是, 1991年前后, 两个项目的参与者都认识到:世界不需要两个不同的单一字符集。
它们合并双方的工作成果,并为创立一个单一编码表而协同工作。
两个项目仍都存在并独立地公布各自的标准,但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容,并紧密地共同调整任何未来的扩展。
Unicode 标准额外定义了许多与字符有关的语义符号学,一般而言是对于实现高质量的印刷出版系统的更好的参考。
四、UTF-8编码UCS-2和UCS-4编码很难在许多当前的应用和协议中使用,这些应用和协议假定字符为一个8或7比特的字节。
即使新的可以处理16比特字符的系统,却不能处理UCS-4数据。