Unicode字符集
字符编码(1)——Unicode,utf-8

字符编码(1)——Unicode,utf-8字符编码编码是⼀个将⼀组Unicode字符转换业个字节序列的过程。
⽽解码是将⼀个编码字节序列转换为⼀组Unicode字符的过程。
Unicode字符是什么?Unicode字符集可以简写为UCS,也就是Unicode charactor setUnicode编码是国际组织制定的可以容纳世界上所有⽂字和符号的字符编码⽅案。
它通过0到0x10FFFF来映射字符,最多可容纳1114112个字符(16进制的10FFFF的值是1114111,然后加⼀个0x000000就是1114112个)。
可以看⼀下1114112的⼆进制表⽰形式为:1 0001 00000000 00000000UTF是什么?UTF是Unicode转换格式的意思,是UCS Transformation Format的缩写。
Utf-8UTF-8以字节为单位对Unicode进⾏编码。
utf-8特点是对不同范围的字符⽤不同长度的编码。
从Unicode到UTF-8的编码⽅式如下:Unicode编码(16进制) ║ UTF-8 字节流(⼆进制)000000 - 00007F ║ 0xxxxxxx000080 - 0007FF ║ 110xxxxx 10xxxxxx000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx例如:“赵”这个字的Unicode编码(16进制表⽰⽅法)是:8d 75这个编码在.net中可以通过ToString()⽅法来实现。
为了进⾏后边的说明。
这⾥先给出测试⽤的转换⽅法:public static class CharSetHelper{public static string TransCoding(this int iValue,eTrans eType){return Convert.ToString(iValue, (int)eType);}public static string GetCorrectCoding(this string selfChar, Encoding encoding, eTrans eType){int iUnicode = (int)char.Parse(selfChar);return iUnicode.TransCoding(eType);}}public enum eTrans{Binary=2,Octonary=8,Decimal=10,Hexadecimal=16}⼀个枚举,⽤于枚举数的进制,⼀个从字串转换到特定的字符编码,并以指定进制表⽰的⽅法。
Unicode字符编码表

注:除非有特别指明,否则以下符号皆属“半角”而非“全角”。
代码显示描述U+0020 空格U+0021 ! 叹号U+0022 " 双引号U+0023 # 井号U+0024 $ 价钱/货币符号U+0025 % 百分比符号U+0026 & 英文“and”的简写符号U+0027 ' 引号U+0028 ( 开圆括号U+0029 ) 关圆括号U+002A * 星号U+002B + 加号U+002C , 逗号U+002D - 连字号/减号U+002E . 句号U+002F / 由右上至左下的斜线U+0030 0 数字0U+0031 1 数字1U+0032 2 数字2U+0033 3 数字3U+0034 4 数字4U+0035 5 数字5U+0036 6 数字6U+0037 7 数字7U+0038 8 数字8U+0039 9 数字9U+003A : 冒号U+003B ; 分号U+003C < 小于符号U+003D = 等于号U+003E > 大于符号U+003F ? 问号U+0040 @ 英文“at”的简写符号U+0041 A 拉丁字母AU+0043 C 拉丁字母CU+0044 D 拉丁字母DU+0045 E 拉丁字母EU+0046 F 拉丁字母FU+0047 G 拉丁字母GU+0048 H 拉丁字母HU+0049 I 拉丁字母IU+004A J 拉丁字母JU+004B K 拉丁字母KU+004C L 拉丁字母LU+004D M 拉丁字母MU+004E N 拉丁字母NU+004F O 拉丁字母OU+0050 P 拉丁字母PU+0051 Q 拉丁字母QU+0052 R 拉丁字母RU+0053 S 拉丁字母SU+0054 T 拉丁字母TU+0055 U 拉丁字母UU+0056 V 拉丁字母VU+0057 W 拉丁字母WU+0058 X 拉丁字母XU+0059 Y 拉丁字母YU+005A Z 拉丁字母ZU+005B [ 开方括号U+005C \ 由左上至右下的斜线U+005D ] 关方括号U+005E ^ 抑扬(重音)符号U+005F _ 底线U+0060 ` 重音符U+0061 a 拉丁字母aU+0062 b 拉丁字母bU+0063 c 拉丁字母cU+0064 d 拉丁字母dU+0065 e 拉丁字母eU+0067 g 拉丁字母gU+0068 h 拉丁字母hU+0069 i 拉丁字母iU+006A j 拉丁字母jU+006B k 拉丁字母kU+006C l 拉丁字母l(L的小写)U+006D m 拉丁字母mU+006E n 拉丁字母nU+006F o 拉丁字母oU+0070 p 拉丁字母pU+0071 q 拉丁字母qU+0072 r 拉丁字母rU+0073 s 拉丁字母sU+0074 t 拉丁字母tU+0075 u 拉丁字母uU+0076 v 拉丁字母vU+0077 w 拉丁字母wU+0078 x 拉丁字母xU+0079 y 拉丁字母yU+007A z 拉丁字母zU+007B { 开卷曲括号U+007C | 直棒U+007D } 关卷曲括号U+007E ~ 波浪纹拉丁字母-1代码显示描述U+00A1 ? 倒转的叹号U+00A2 ? (货币单位)分钱、毫子U+00A3 ? (货币)英镑U+00A4 ¤(货币)当货币未有符号时以此替代U+00A5 ? (货币)日圆U+00A6 ? 两条断开的直线U+00A7 §文件分不同部分U+00A8 ¨(语言)分音U+00A9 ? 版权符U+00AA ? (意大利文、葡萄牙文、西班牙文)阴性序数U+00AB ? 双重角形引号U+00AC ? 逻辑非U+00AE ?? 商标U+00AF ? 长音U+00B0 °角度U+00B1 ±正负号U+00B2 ? 二次方U+00B3 ? 三次方U+00B4 ? 锐音符U+00B5 ? 百万分之一,10?6U+00B6 ? 文章分段U+00B7 ·间隔号U+00B8 ? 软音符U+00B9 ? 一次方U+00BA ? (意大利文、葡萄牙文、西班牙文)阳性序数U+00BB ? 指向右的双箭头U+00BC ? 四分之一U+00BD ? 二分之一U+00BE ? 四分之三U+00BF ? 倒转的问号U+00C1 ? 在拉丁字母A 上加重音符U+00C2 ? 在拉丁字母A 上加抑扬符“^”U+00C3 ? 在拉丁字母A 上加“~”U+00C4 ? 在拉丁字母A 上加分音符“..”U+00C5 ? 在拉丁字母A 上加角度符“°”U+00C6 ? 拉丁字母A、E 的混合U+00C7 ? 在拉丁字母C 下加软音符U+00C8 ? 在拉丁字母E 上加重音符U+00C9 ? 在拉丁字母E 上加锐音符U+00CA ? 在拉丁字母E 上加抑扬符U+00CB ? 在拉丁字母E 上加分音符U+00CC ? 在拉丁字母I 上加重音符U+00CD ? 在拉丁字母I 上加锐音符U+00CE ? 在拉丁字母I 上加抑扬符U+00D0 ? 古拉丁字母?,现只有法罗文和冰岛文使用U+00D1 ? 在拉丁字母N 上加波浪纹“~”U+00D2 ? 在拉丁字母O 上加锐音符U+00D3 ? 在拉丁字母O 上加重音符U+00D4 ? 在拉丁字母O 上加抑扬符U+00D5 ? 在拉丁字母O 上加波浪纹“~”U+00D6 ? 在拉丁字母O 上加分音符U+00D7 ×乘号,亦可拖按“Alt”键,同时按“41425”五键U+00D8 ? 在拉丁字母O 由右上至左下加对角斜线“/”U+00D9 ? 在拉丁字母U 上加重音符U+00DA ? 在拉丁字母U 上加锐音符U+00DB ? 在拉丁字母U 上加抑扬符U+00DC ? 在拉丁字母U 上加分音符U+00DD ? 在拉丁字母Y 上加锐音符U+00DE ? 古拉丁字母?,现已被“Th”取替U+00DF ? 德文字母?U+00E0 à在拉丁字母a 上加重音符U+00E1 á在拉丁字母a 上加锐音符U+00E2 ? 在拉丁字母a 上加抑扬符U+00E3 ? 在拉丁字母a 上加波浪纹“~”U+00E4 ? 在拉丁字母a 上加分音符U+00E5 ? 在拉丁字母a 上加角度符“°”U+00E6 ? 拉丁字母a、e 的混合U+00E7 ? 在拉丁字母c 上加软音符U+00E8 è在拉丁字母e 上加锐音符U+00E9 é在拉丁字母e 上加重音符U+00EA ê在拉丁字母e 上加抑扬符U+00EB ? 在拉丁字母e 上加分音符U+00EC ì在拉丁字母i 上加重音符U+00ED í在拉丁字母i 上加锐音符U+00EE ? 在拉丁字母i 上加抑扬符U+00EF ? 在拉丁字母i 上加分音符U+00F0 ? 古拉丁字母?的小写U+00F1 ? 在拉丁字母n 上加波浪纹“~”U+00F2 ò在拉丁字母o 上加重音符U+00F4 ? 在拉丁字母o 上加抑扬符U+00F5 ? 在拉丁字母o 上加波浪纹“~”U+00F6 ? 在拉丁字母o 上加分音符U+00F7 ÷除号,亦可拖按“Alt”键,同时按“41426”五键U+00F8 ? 在拉丁字母o 由右上至左下加对角斜线“/”U+00F9 ù在拉丁字母u 上加重音符U+00FA ú在拉丁字母u 上加锐音符U+00FB ? 在拉丁字母u 上加抑扬符U+00FC ü在拉丁字母u 上加分音符U+00FD ? 在拉丁字母u 上加锐音符U+00FE ? 古拉丁字母?,现已被“th”取替U+00FF ? 在拉丁字母u 上加分音符拉丁字母(扩展A)代码显示描述U+0100 ? 在拉丁字母A 上加长音符U+0101 ā 在拉丁字母a 上加长音符U+0102 ? 在拉丁字母A 上加短音符U+0103 ? 在拉丁字母a 上加短音符U+0104 ? 在拉丁字母A 上加反尾形符U+0105 ? 在拉丁字母a 上加反尾形符拉丁字母(扩展C)代码显示描述U+2C60 ? 在拉丁字母“L”中间加两条横线“=”U+2C61 ? 在拉丁字母“l”(L 的小写)中间加一条横线“-”U+2C62 ? 在拉丁字母“L”(大写)中间加一条波浪线“~”U+2C63 ? 在拉丁字母“P”中间加一条横线“-”U+2C64 ? 在拉丁字母“R”下加一条尾巴U+2C65 ? 在拉丁字母“a”上加一条对角斜线“/”U+2C66 ? 在拉丁字母“t”上加一条对角斜线“/”U+2C67 ? 在拉丁字母“H”下加一条尾巴U+2C68 ? 在拉丁字母“h”下加一条尾巴U+2C69 ? 在拉丁字母“K”下加一条尾巴U+2C6A ? 在拉丁字母“k”下加一条尾巴U+2C6B ? 在拉丁字母“Z”下加一条尾巴U+2C6C ? 在拉丁字母“z”下加一条尾巴U+2C74 ? 在拉丁字母“v”的起笔加一个弯勾U+2C75 ? 拉丁字母“H”的左半部U+2C76 ? 拉丁字母“h”的左半部U+2C77 ? 希腊字母“φ”的上半部彝文字母拉丁字母(扩展D)代码显示描述U+A720 ? 强调音调音昂的改造字母U+A721 ? 强调音调低沉的改造字母特殊代码显示描述U+FFFC 取代无法显示字符的“OBJ”U+FFFD ? 无法显示的字符以它取代Unicode 编码表Unicode 编码表BMP SMP SIP SSP0000—0FFF 8000—8FFF 10000—10FFF 20000—20FFF 28000—28FFF E0000—E0FFF1000—1FFF 9000—9FFF 21000—21FFF 29000—29FFF2000—2FFF A000—AFFF 12000—12FFF 22000—22FFF 2A000—2AFFF 3000—3FFF B000—BFFF 23000—23FFF4000—4FFF C000—CFFF 24000—24FFF 2F000—2FFFF5000—5FFF D000—DFFF 1D000—1DFFF 25000—25FFF6000—6FFF E000—EFFF 26000—26FFF7000—7FFF F000—FFFF 1F000—1FFFF 27000—27FFF盲文图案。
汉字编码字符集

汉字编码字符集汉字编码字符集是指用于表示和存储汉字的一套编码系统。
在计算机领域,为了能够准确地表示和处理汉字,人们设计了多种不同的汉字编码字符集。
本文将介绍几种常见的汉字编码字符集,包括GB2312、GBK、Unicode以及UTF-8。
一、GB2312GB2312是中国国家标准局于1980年发布的一种汉字编码字符集,是最早被广泛使用的汉字字符集之一。
GB2312字符集包含了7445个汉字和682个非汉字字符,采用双字节表示每个字符。
其中,第一个字节的范围是0xB0至0xF7,第二个字节的范围是0xA1至0xFE。
GB2312字符集主要适用于简体中文。
二、GBK随着计算机技术的发展和汉字数量的增加,GB2312字符集的容量已经无法满足需求。
为了解决这个问题,国家标准局于1995年发布了GBK字符集,它是对GB2312字符集的扩充和改进。
GBK字符集兼容GB2312字符集,同时加入了21003个汉字,总计包含了21886个汉字。
GBK字符集同样采用双字节表示每个字符,第一个字节的范围是0x81至0xFE,第二个字节的范围是0x40至0xFE。
GBK字符集支持简体中文和繁体中文。
三、UnicodeUnicode是一种国际标准字符集,旨在为全球所有字符提供唯一的编码。
Unicode采用16位的编码方案,可以支持最多65536个不同的字符。
不仅包括了各个国家语言的文字,还包括了数学符号、技术符号、图形符号等。
Unicode字符集为各种语言的文字提供了一个统一的编码标准。
四、UTF-8UTF-8是一种可变长度的Unicode编码方案,更好地解决了存储效率和兼容性的问题。
UTF-8使用1至4个字节来表示一个字符,根据不同的字符而变化。
对于单字节的字符,编码和ASCII码相同,兼容ASCII码。
对于多字节的字符,第一个字节的高位标识了字节数。
UTF-8字符集可以表示Unicode字符集中的所有字符。
在计算机系统中,为了使不同的系统能够正确地处理汉字编码,一般需要统一选择一种字符集来使用。
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个代码中的某些总是跟随者第二个字节(称作首字节和跟随字节)。
计算机字符集

西欧语言的字符集
详细描述
ISO 8859-1是一种单字节字符集,主要支持西欧语言的字符编码,包括英语 、法语、德语、意大利语、西班牙语等。它是最早的国际标准字符集之一, 广泛应用于网页和文档处理等领域。
Macintosh字符集
总结词
苹果公司开发的字符集
详细描述
Macintosh字符集是苹果公司为Mac OS操作系统开发的一种多字节字符集,支持包括中文、日文、 韩文等东亚语言的字符编码。它使用Unicode编码方案,是现代计算机系统中常用的字符集之一。
UTF-16采用固定长度的编码方式,每个字符的编 码长度为2或4个字节,适合对内存占用要求较高 的场景。
UTF-8是目前使用最广泛的编码方式,它采用可 变长度的编码方式,每个字符的编码长度可以是 1~4个字节,适应了不同语言字符的编码需求。
UTF-32采用固定长度的编码方式,每个字符的编 码长度为4个字节,适合对精度要求较高的场景。
IBM字符集
总结词
IBM公司开发的字符集
详细描述
IBM字符集是IBM公司为自身产品开发的一种多字节字符集,支持包括多种语言字符编码,如英语、法语、德 语、意大利语、西班牙语、中文、日文、韩文等。它广泛应用于IBM公司的软件产品中,也受到其他软件系统 的支持。
THANKS
谢谢您的观看
字符集的分类与特点
单字节字符集
每个字符只占用一个字节,通常用于表示英文字 符和数字。常见的单字节字符集包括ASCII、ISO 8859系列等。
可变长编码字符集
这种字符集的特点是每个字符可以占用不同数量 的字节。UTF-8就是一种可变长编码字符集,它 根据不同的字符使用不同的编码长度。
多字节字符集
编码标准:ASCII、GBK、Unicode(UTF8、UTF16、UTF32)

编码标准:ASCII、GBK、Unicode(UTF8、UTF16、UTF32)
英⽂编码(单字节字符集,码值范围0~127):字节最⾼位是0
ASCII编码,⽤于英⽂字符。
中⽂编码(双字节字符集):⾸字节(8位)的最⾼位是1。
可依据⾸字节最⾼位来判断中英⽂。
GB2312,旧版,6763个汉字。
GBK,中⽂字符升级版,21000多个汉字。
国际编码:Unicode编码,各国语⾔字符
不同编码⽅式,值不同,如“中”的GBK编码:0xD6D0,Unicode编码:0x4E2D
Unicode编码的3种实现⽅式:UTF8、UTF16、UTF32。
UTF8变长编码,智能分配1-4个字节。
UTF16定长编码,2个字节。
UTF32定长编码,4个字节。
UTF16编码,中英⽂字符都占2个字节。
其定义的类型称为宽字符类型wchar_t,使⽤⽅式如下
wchar_t d[] = L"中国"; //宽字符类型
wcout.imbue(locale("chs"));//Windows系统,语⾔设置为简体中⽂。
Unicode转GBK
wcout << d; //宽字符输出,中国。
字符编码和字符集到底有什么区别?Unicode和UTF-8是什么关系?

字符编码和字符集到底有什么区别?Unicode和UTF-8是什么关系?前⾔想必⼤家编写代码时肯定和我⼀样,也遇到过汉字乱码的问题。
特别是,有时候和上下游对接接⼝,不能统⼀编码格式的话,⼀堆乱码问题,让⼈头⽪发⿇。
那么为什么会有这么多的乱码问题?什么是字符编码?什么是字符集?他们之间有什么区别和联系?什么是 Unicode ? Unicode 和我们常说的 UTF-8 ⼜有什么关系?字符编码和解码要想搞清楚上⾯的问题,⾸先我们要知道,在计算机中,不管是⼀段⽂字、⼀张图⽚还是⼀段视频,最终都是以⼆进制的⽅式来存储。
也就是最终都会转化为0001 1011 0010 0110这样的格式。
换句话说,计算机只认识 0 和 1 这样的数字,并不能直接存储字符。
所以我们需要告诉它什么样的字符对应的是什么数字。
例如,我们的业务中有记录客户端的客户⾏为⽇志,然后导出⽂件来分析,字段间会以ESC来分隔。
我在编写代码的时候,就需要定义⼀下这个ESC字符应该对应什么数字,这样计算机才能识别并存储。
⽐如我把它定为0001 1011,这样计算机就把ESC这个字符存了下来。
等我下次需要查看的时候,根据对应关系把它解出来就可以了。
上边的两个过程就对应字符的编码和解码过程。
字符编码就是把字符按⼀定的规则,转换成数字。
字符解码是编码的逆过程,即把数字按规则转换成字符。
这样看来,貌似没有什么问题。
但是,这是我⾃⼰定义的编码规则,我同桌阿霄就不乐意了。
他⾮要认为ESC应该定义为1101 1000,好家伙正好和我定义的⼆进制数字顺序相反。
那结果肯定不⽤说了,我把0001 1011这串数字给他之后,按照他的编码规则来解,肯定是&$#!这样的东西。
所以,乱码问题说到底,就是编码和解码的规则对应不上导致的。
ASCII 码为了避免我和阿霄因为编码问题打起来,美国国家标准学会(AMERICAN NATIONAL STANDARDS INSTITUTE) ANSI 组织发话了。
unicode字符大全

unicode字符大全Unicode字符大全。
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode字符集目前已经包含了绝大部分世界上使用的字符,包括了文字、标点符号、符号、数字、图形、控制字符、格式控制字符等。
Unicode字符集的编码空间非常大,目前已经使用了17个代码级别,每个代码级别包含65536个码位,总共可以容纳1114112个字符。
其中,基本多文本平面(BMP)占据了第一个代码级别,包含了绝大部分常用的字符。
除了BMP之外,还有辅助平面(SMP)、辅助辅助平面(SIP)等,用于存放一些不常用的字符和特殊用途的字符。
Unicode字符集中的字符可以分为以下几类:1. 控制字符,这些字符用于控制文本的显示和处理,如换行符、回车符、制表符等。
2. 标点符号,包括了各种常见的标点符号,如句号、逗号、双引号、括号等。
3. 数字,包括了阿拉伯数字、罗马数字、汉字数字等。
4. 字母,包括了拉丁字母、希腊字母、西里尔字母、汉字等。
5. 符号,包括了各种数学符号、货币符号、箭头符号、几何图形符号等。
Unicode字符集的编码方式有多种,常见的编码方式包括UTF-8、UTF-16、UTF-32等。
其中,UTF-8是一种可变长编码方式,采用1~4个字节来表示一个字符,适合于存储英文和西欧语言;UTF-16采用2或4个字节来表示一个字符,适合于存储大部分常用字符;UTF-32采用4个字节来表示一个字符,适合于存储所有Unicode字符。
在使用Unicode字符集时,需要注意以下几点:1. 不同的编程语言和操作系统对Unicode的支持程度不同,需要根据具体情况选择合适的编程环境和工具。
2. 在处理Unicode字符时,需要考虑字符的长度、编码方式、显示方式等因素,以避免出现乱吗、显示异常等问题。
各个字符集关系

各个字符集关系字符集是计算机中用来表示和存储字符的编码方案。
不同的字符集拥有不同的字符映射表,即将字符映射到特定的二进制代码上。
在计算机科学中,有许多不同的字符集,如ASCII、Unicode、UTF-8等。
本文将详细介绍各个字符集之间的关系。
首先,ASCII(美国标准信息交换码)是最早的字符集之一。
它使用7位二进制代码来表示128个字符,包括英文字母、数字和特殊字符。
ASCII标准定义了每个字符的二进制代码和对应的显示符号。
ASCII编码被广泛应用于美国和英语系国家。
然而,ASCII的局限性在于它只能表示英文字符和一些常见的特殊符号,无法表示其他国家的字符集。
为了解决这个问题,ISO(国际标准化组织)提出了ISO-8859字符集系列。
ISO-8859字符集通过扩展ASCII,使用8位二进制代码表示256个字符。
ISO-8859字符集包括多种变种,如ISO-8859-1(Latin-1)、ISO-8859-2(Latin-2)等,每个变种针对不同的语言和地区。
然而,随着国际化的发展,ISO-8859字符集仍然无法满足全球多语言的需求。
为此,国际化组织提出了Unicode字符集。
Unicode字符集旨在成为全球统一的字符编码方案,能够包含世界上所有的字符。
Unicode使用16位二进制代码来表示字符,它定义了每个字符的唯一编号,称为码点(code point)。
Unicode的码点范围非常广阔,可以涵盖几乎所有的字符。
然而,使用16位二进制代码会造成存储和传输的浪费。
为此,发展了多种Unicode的字符编码方案,如UTF-8、UTF-16和UTF-32。
UTF-8是一种变长的字符编码方案,使用8位二进制代码表示字符。
UTF-8的编码规则如下:-对于ASCII字符,使用7位二进制代码与ASCII完全兼容。
-对于非ASCII字符,使用多个字节表示。
编码的首字节是非零的,使用剩余的7位二进制代码来表示字符。
字符编码简介:ASCII,Unicode,UTF-8,GB2312

字符编码简介:ASCII,Unicode,UTF-8,GB2312字符编码简介:ASCII,Unicode,UTF-8,GB23121. ASCII码我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。
每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。
也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。
这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。
这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。
比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。
于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。
比如,法语中的é的编码为130(二进制10000010)。
这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。
不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。
比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。
但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。
一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。
Unicode--宽字节字符集

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,这样,可以尽量减少代码的影响。
常用字符集

常用字符集字符集经常使用于计算机编程中,其本质是一系列标准映射规则,它们由定义了相应字符编码的编码字符集和描述性指令集组成。
这些字符集用来将汉字或者其他字符转换成一系列的二进制字节(又称计算机可识别的字符)。
这些字符集通常被用来表示文本文件,文件可以被转换成可以在计算机上读取的内容,并且能够正确的显示方框字符、符号、图形和汉字等等。
目前,计算机和软件使用的最常用的字符集可以分为两大类:Unicode字符集和 ASCII符集。
一、Unicode字符集Unicode是全世界最广泛使用的字符编码方案,它定义了统一的码位空间,用来表示所有的文字。
Unicode的码位空间范围是0-10FFFF”,Unicode字符集使用两个字节表示每一个字符,因此总共可以表示 1,114,112个字符,Unicode可以表示几乎所有的字符,包括拉丁文、希腊文、中文、日文等等。
二、ASCII字符集ASCII (American Standard Code for Information Interchange)是一种最早定义的字符编码标准,它是1960年由美国国家标准技术研究所(NIST)提出的。
ASCII字符集定义了128个字符,其中包括26个大写和小写英文字母、数字(0-9)、标点符号、控制字符等。
用户可以在不同的软件中使用ASCII字符集,交换、查看和处理文件等,以便满足不同的文件格式要求。
每一种字符集都有它自己的特点和用途,但Unicode字符集更加通用,其能够满足大多数对中文、拉丁字母、希腊字母、日文等字符的要求,因此,它是应用最为广泛的字符集。
尽管Unicode是当前计算机领域最常用的字符集,但它也有一些问题,比如字符编码的字节数相较于其他字符集较大,并且在兼容处理上存在一定的困难。
此外,在处理多语言文本时也必须谨慎,因为不同语言的字符集可能存在不兼容的问题。
比如,中文和英文之间的字符、汉字和日文的符号等等,如果使用错误的字符集,可能会导致有关文件的正确显示受到影响,从而造成误解。
汉字对应的数字代码 别

汉字对应的数字代码别汉字对应的数字代码是指在计算机系统中,每个汉字都有一个唯一的编号来表示。
这个编号被称为Unicode码。
Unicode是一种国际字符集,用于表示世界上所有的字符,包括各种文字、符号和表情符号等。
它为每个字符分配了一个唯一的数字代码,称为码点。
Unicode码点的范围从U+0000到U+10FFFF,共计1,114,112个码点。
Unicode码点的表示方式通常以U+开头,后面跟着一个4位或更多位的十六进制数。
例如,汉字"中"的Unicode码点为U+4E2D。
Unicode码点的使用使得计算机可以在不同的操作系统和程序中准确地识别和显示各种字符。
在计算机编程和文字处理中,Unicode码点常常用于表示字符,进行字符输入和输出等操作。
对于常用汉字,Unicode码点通常可以通过快捷方式进行输入,如"中"字的快捷输入方式为"U-56FD"。
在常用的操作系统和文字处理软件中,都提供了输入Unicode码点的方法。
在计算机编程中,Unicode码点通常用转义序列的方式表示。
转义序列以"\u"或"\U"开头,后面跟着对应的十六进制数。
例如,汉字"中"的转义序列为"\u4E2D"。
除了Unicode码点外,还存在一种常用的表示汉字的数字代码,称为GB码或GB2312码。
这是中国国家标准GB2312-80中规定的一种对汉字进行编码的方法。
GB码将汉字编码成一个两字节的数字代码,其中第一个字节表示区号,第二个字节表示位号。
例如,汉字"中"的GB码为B0A1。
GB码的使用主要针对汉字,对其他字符的编码则不具备优势。
因此,随着Unicode的普及,GB码的使用逐渐减少。
总结起来,汉字对应的数字代码主要有Unicode码和GB码两种。
Unicode码是全球字符集的统一编码标准,适用范围广泛,用于计算机系统中表示和处理所有的字符。
中文unicode范围

中文unicode范围中文unicode范围是编码技术应用于中文文本的关键技术。
它既是中文文本的标准格式,又是把中文文本编码存储的唯一办法。
它的基本概念是把文本字符编码为一系列的数字,以便让电脑进行识别和处理。
中文unicode范围是指基于unicode标准范围中定义的中文字符集以及它们相应的unicode代码点( codepoint)。
该范围包括所有支持中文的unicode版本,包括中文字符,标点符号,数字以及各种符号。
按照unicode标准,中文unicode范围包括4个广泛使用的字符集:GBK(中国本土字符集)、Big5(台湾字符集)、UniHan(统一中日韩字符集)以及GB18030(中国统一的国家标准)。
每一个字符集都定义了专用的码位范围,这些码位就是中文unicode范围。
简单来说,中文unicode范围就是 unicode文本编码中所定义的中文字符范围。
大概范围是 U+4E00U+9FFF,中U+4E00 代表“一”U+9FFF代表“”,它们之间的所有字符都算做中文unicode范围的一部分。
为了支持不同的操作系统,中文unicode范围也支持各种平台的中文字符集,如windows、macOS、linux、android、ios等系统,以及支持中文的open source字符集。
这样,用户无论使用的是哪种系统,只要使用支持中文unicode范围的字符集,就可以正确显示和存储文本中的中文字符。
此外,在支持中文unicode范围的字符集中,还有一些特殊字符,如汉语拼音、日语拼音等。
这些字符在中文unicode范围内也有规定,可以被电脑正确识别和存储。
总之,中文unicode范围是一种规定,把文本字符编码为一系列的数字,以便让电脑正确地识别和存储文本字符。
它有助于解决电脑操作时所遇到的文本乱码问题,同时也为中文文本的存储和处理提供了正确的保证。
Unicode 和 UTF-8 的区别

Unicode 和 UTF-8 的区别简单来说:Unicode是「字符集」UTF-8是「编码规则」其中:字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)编码规则:将「码位」转换为字节序列的规则(编码/解码可以理解为加密/解密的过程)广义的Unicode是一个标准,定义了一个字符集以及一系列的编码规则,即Unicode字符集和 UTF-8、UTF-16、UTF-32等等编码……Unicode字符集为每一个字符分配一个码位,例如「知」的码位是30693,记作 U+77E5(3 0693的十六进制为0x77E5)。
UTF-8顾名思义,是一套以8位为一个编码单位的可变长编码。
会将一个码位编码为1到4个字节:U+ 0000 ~ U+ 007F: 0XXXXXXXU+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXXU+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXXU+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX根据上表中的编码规则,之前的「知」字的码位 U+77E5属于第三行的范围:77 E 50111011111100101二进制的77E5--------------------------0111011111100101二进制的77E51110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)111001111001111110100101代入模版E 79F A 5这就是将 U+77E5按照 UTF-8编码为字节序列 E79FA5 的过程。
反之亦然。
关于Unicode字符集

关于Unicode字符集最初的unicode编码是固定长度的,16位,也就是2两个字节代表⼀个字符,这样⼀共可以表⽰65536个字符。
显然,这样要表⽰各种语⾔中所有的字符是远远不够的。
Unicode4.0规范考虑到了这种情况,定义了⼀组附加字符编码,附加字符编码采⽤2个16位来表⽰,这样最多可以定义1048576个附加字符,⽬前unicode4.0只定义了45960个附加字符。
Unicode只是⼀个编码规范,⽬前实际实现的unicode编码只要有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进⾏转换。
UTF-8UTF-8是⼀种8位的unicode字符集,编码长度是可变的,并且是ASCII字符集的严格超集,也就是说ASCII中每个字符的编码在UTF-8中是完全⼀样的。
UTF-8字符集中,⼀个字符可能是1个字节,2个字节,3个字节或者4个字节长。
⼀般来说,欧洲的字母字符长度为1到2个字节,⽽亚洲的⼤部分字符则是3个字节,附加字符为4个字节长。
Unix平台中普遍⽀持UTF-8字符集,HTML和⼤多数浏览器也⽀持UTF-8,⽽window和java则⽀持UCS-2。
UTF-8的主要优点:对于欧洲字母字符需要较少的存储空间。
容易从ASCII字符集向UTF-8迁移。
UCS-2UCS-2是固定长度为16位的unicode字符集。
每个字符都是2个字节,UCS-2只⽀持unicode3.0,所以不⽀持附加字符。
UCS-2的优点:对于亚洲字符的存储空间需求⽐UTF-8少,因为每个字符都是2个字节。
处理字符的速度⽐UTF-8更快,因为是固定长度编码的。
对于windows和java的⽀持更好。
UTF-16UTF-16也是⼀种16位编码的字符集。
实际上,UTF-16就是UCS-2加上附加字符的⽀持,也就是符合unicode4.0规范的UCS-2。
所以UTF-16是UCS-2的严格超集。
Unicode字符编码表

注:除非有特别指明,否则以下符号皆属“半角”而非“全角”。
代码显示描述U+0020 空格U+0021 ! 叹号U+0022 " 双引号U+0023 # 井号U+0024 $ 价钱/货币符号U+0025 % 百分比符号U+0026 & 英文“and”的简写符号U+0027 ' 引号U+0028 ( 开圆括号U+0029 ) 关圆括号U+002A * 星号U+002B + 加号U+002C , 逗号U+002D - 连字号/减号U+002E . 句号U+002F / 由右上至左下的斜线U+0030 0 数字0U+0031 1 数字1U+0032 2 数字2U+0033 3 数字3U+0034 4 数字4U+0035 5 数字5U+0036 6 数字6U+0037 7 数字7U+0038 8 数字8U+0039 9 数字9U+003A : 冒号U+003B ; 分号U+003C < 小于符号U+003D = 等于号U+003E > 大于符号U+003F ? 问号U+0040 @ 英文“at”的简写符号U+0041 A 拉丁字母AU+0043 C 拉丁字母CU+0044 D 拉丁字母DU+0045 E 拉丁字母EU+0046 F 拉丁字母FU+0047 G 拉丁字母GU+0048 H 拉丁字母HU+0049 I 拉丁字母IU+004A J 拉丁字母JU+004B K 拉丁字母KU+004C L 拉丁字母LU+004D M 拉丁字母MU+004E N 拉丁字母NU+004F O 拉丁字母OU+0050 P 拉丁字母PU+0051 Q 拉丁字母QU+0052 R 拉丁字母RU+0053 S 拉丁字母SU+0054 T 拉丁字母TU+0055 U 拉丁字母UU+0056 V 拉丁字母VU+0057 W 拉丁字母WU+0058 X 拉丁字母XU+0059 Y 拉丁字母YU+005A Z 拉丁字母ZU+005B [ 开方括号U+005C \ 由左上至右下的斜线U+005D ] 关方括号U+005E ^ 抑扬(重音)符号U+005F _ 底线U+0060 ` 重音符U+0061 a 拉丁字母aU+0062 b 拉丁字母bU+0063 c 拉丁字母cU+0064 d 拉丁字母dU+0065 e 拉丁字母eU+0067 g 拉丁字母gU+0068 h 拉丁字母hU+0069 i 拉丁字母iU+006A j 拉丁字母jU+006B k 拉丁字母kU+006C l 拉丁字母l(L的小写)U+006D m 拉丁字母mU+006E n 拉丁字母nU+006F o 拉丁字母oU+0070 p 拉丁字母pU+0071 q 拉丁字母qU+0072 r 拉丁字母rU+0073 s 拉丁字母sU+0074 t 拉丁字母tU+0075 u 拉丁字母uU+0076 v 拉丁字母vU+0077 w 拉丁字母wU+0078 x 拉丁字母xU+0079 y 拉丁字母yU+007A z 拉丁字母zU+007B { 开卷曲括号U+007C | 直棒U+007D } 关卷曲括号U+007E ~ 波浪纹拉丁字母-1代码显示描述U+00A1 ? 倒转的叹号U+00A2 ? (货币单位)分钱、毫子U+00A3 ? (货币)英镑U+00A4 ¤(货币)当货币未有符号时以此替代U+00A5 ? (货币)日圆U+00A6 ? 两条断开的直线U+00A7 §文件分不同部分U+00A8 ¨(语言)分音U+00A9 ? 版权符U+00AA ? (意大利文、葡萄牙文、西班牙文)阴性序数U+00AB ? 双重角形引号U+00AC ? 逻辑非U+00AE ?? 商标U+00AF ? 长音U+00B0 °角度U+00B1 ±正负号U+00B2 ? 二次方U+00B3 ? 三次方U+00B4 ? 锐音符U+00B5 ? 百万分之一,10?6U+00B6 ? 文章分段U+00B7 ·间隔号U+00B8 ? 软音符U+00B9 ? 一次方U+00BA ? (意大利文、葡萄牙文、西班牙文)阳性序数U+00BB ? 指向右的双箭头U+00BC ? 四分之一U+00BD ? 二分之一U+00BE ? 四分之三U+00BF ? 倒转的问号U+00C1 ? 在拉丁字母A 上加重音符U+00C2 ? 在拉丁字母A 上加抑扬符“^”U+00C3 ? 在拉丁字母A 上加“~”U+00C4 ? 在拉丁字母A 上加分音符“..”U+00C5 ? 在拉丁字母A 上加角度符“°”U+00C6 ? 拉丁字母A、E 的混合U+00C7 ? 在拉丁字母C 下加软音符U+00C8 ? 在拉丁字母E 上加重音符U+00C9 ? 在拉丁字母E 上加锐音符U+00CA ? 在拉丁字母E 上加抑扬符U+00CB ? 在拉丁字母E 上加分音符U+00CC ? 在拉丁字母I 上加重音符U+00CD ? 在拉丁字母I 上加锐音符U+00CE ? 在拉丁字母I 上加抑扬符U+00D0 ? 古拉丁字母?,现只有法罗文和冰岛文使用U+00D1 ? 在拉丁字母N 上加波浪纹“~”U+00D2 ? 在拉丁字母O 上加锐音符U+00D3 ? 在拉丁字母O 上加重音符U+00D4 ? 在拉丁字母O 上加抑扬符U+00D5 ? 在拉丁字母O 上加波浪纹“~”U+00D6 ? 在拉丁字母O 上加分音符U+00D7 ×乘号,亦可拖按“Alt”键,同时按“41425”五键U+00D8 ? 在拉丁字母O 由右上至左下加对角斜线“/”U+00D9 ? 在拉丁字母U 上加重音符U+00DA ? 在拉丁字母U 上加锐音符U+00DB ? 在拉丁字母U 上加抑扬符U+00DC ? 在拉丁字母U 上加分音符U+00DD ? 在拉丁字母Y 上加锐音符U+00DE ? 古拉丁字母?,现已被“Th”取替U+00DF ? 德文字母?U+00E0 à在拉丁字母a 上加重音符U+00E1 á在拉丁字母a 上加锐音符U+00E2 ? 在拉丁字母a 上加抑扬符U+00E3 ? 在拉丁字母a 上加波浪纹“~”U+00E4 ? 在拉丁字母a 上加分音符U+00E5 ? 在拉丁字母a 上加角度符“°”U+00E6 ? 拉丁字母a、e 的混合U+00E7 ? 在拉丁字母c 上加软音符U+00E8 è在拉丁字母e 上加锐音符U+00E9 é在拉丁字母e 上加重音符U+00EA ê在拉丁字母e 上加抑扬符U+00EB ? 在拉丁字母e 上加分音符U+00EC ì在拉丁字母i 上加重音符U+00ED í在拉丁字母i 上加锐音符U+00EE ? 在拉丁字母i 上加抑扬符U+00EF ? 在拉丁字母i 上加分音符U+00F0 ? 古拉丁字母?的小写U+00F1 ? 在拉丁字母n 上加波浪纹“~”U+00F2 ò在拉丁字母o 上加重音符U+00F4 ? 在拉丁字母o 上加抑扬符U+00F5 ? 在拉丁字母o 上加波浪纹“~”U+00F6 ? 在拉丁字母o 上加分音符U+00F7 ÷除号,亦可拖按“Alt”键,同时按“41426”五键U+00F8 ? 在拉丁字母o 由右上至左下加对角斜线“/”U+00F9 ù在拉丁字母u 上加重音符U+00FA ú在拉丁字母u 上加锐音符U+00FB ? 在拉丁字母u 上加抑扬符U+00FC ü在拉丁字母u 上加分音符U+00FD ? 在拉丁字母u 上加锐音符U+00FE ? 古拉丁字母?,现已被“th”取替U+00FF ? 在拉丁字母u 上加分音符拉丁字母(扩展A)代码显示描述U+0100 ? 在拉丁字母A 上加长音符U+0101 ā 在拉丁字母a 上加长音符U+0102 ? 在拉丁字母A 上加短音符U+0103 ? 在拉丁字母a 上加短音符U+0104 ? 在拉丁字母A 上加反尾形符U+0105 ? 在拉丁字母a 上加反尾形符拉丁字母(扩展C)代码显示描述U+2C60 ? 在拉丁字母“L”中间加两条横线“=”U+2C61 ? 在拉丁字母“l”(L 的小写)中间加一条横线“-”U+2C62 ? 在拉丁字母“L”(大写)中间加一条波浪线“~”U+2C63 ? 在拉丁字母“P”中间加一条横线“-”U+2C64 ? 在拉丁字母“R”下加一条尾巴U+2C65 ? 在拉丁字母“a”上加一条对角斜线“/”U+2C66 ? 在拉丁字母“t”上加一条对角斜线“/”U+2C67 ? 在拉丁字母“H”下加一条尾巴U+2C68 ? 在拉丁字母“h”下加一条尾巴U+2C69 ? 在拉丁字母“K”下加一条尾巴U+2C6A ? 在拉丁字母“k”下加一条尾巴U+2C6B ? 在拉丁字母“Z”下加一条尾巴U+2C6C ? 在拉丁字母“z”下加一条尾巴U+2C74 ? 在拉丁字母“v”的起笔加一个弯勾U+2C75 ? 拉丁字母“H”的左半部U+2C76 ? 拉丁字母“h”的左半部U+2C77 ? 希腊字母“φ”的上半部彝文字母拉丁字母(扩展D)代码显示描述U+A720 ? 强调音调音昂的改造字母U+A721 ? 强调音调低沉的改造字母特殊代码显示描述U+FFFC 取代无法显示字符的“OBJ”U+FFFD ? 无法显示的字符以它取代Unicode 编码表Unicode 编码表BMP SMP SIP SSP0000—0FFF 8000—8FFF 10000—10FFF 20000—20FFF 28000—28FFF E0000—E0FFF1000—1FFF 9000—9FFF 21000—21FFF 29000—29FFF2000—2FFF A000—AFFF 12000—12FFF 22000—22FFF 2A000—2AFFF 3000—3FFF B000—BFFF 23000—23FFF4000—4FFF C000—CFFF 24000—24FFF 2F000—2FFFF5000—5FFF D000—DFFF 1D000—1DFFF 25000—25FFF6000—6FFF E000—EFFF 26000—26FFF7000—7FFF F000—FFFF 1F000—1FFFF 27000—27FFF盲文图案。
如何使用Unicode字符集和多语言支持

如何使用Unicode字符集和多语言支持随着全球化的不断发展,越来越多的软件和应用程序需要支持多种语言,以满足不同国家和地区用户的需求。
在多语言支持方面,Unicode字符集扮演着至关重要的角色。
Unicode字符集是目前最为广泛使用的字符编码系统,它能够覆盖世界上几乎所有的字符,并支持超过200种语言的书写和显示。
本文将介绍如何正确使用Unicode字符集和多语言支持技术。
一、Unicode字符集的基本概念和原理Unicode字符集是一种为世界上所有字符规定唯一编码的标准。
它的目标是取代过去各种不同国家和地区使用的多种字符编码,实现全球通用的、统一的字符编码标准。
Unicode字符集由一个庞大的字符集合和相应的字符编码方案组成。
每个字符都有一个唯一的编码值,可以用来唯一地标识该字符。
Unicode字符集采用16位或32位的编码形式,可以表示几乎所有的字符。
Unicode字符集的基本原理是将每个字符与一个唯一的编码值关联起来。
这个编码值可以是16位的十六进制数(称为码点),也可以是32位的十六进制数。
比如,拉丁字母A的Unicode编码是U+0041,中文汉字“好”的Unicode编码是U+597D。
通过使用Unicode字符集,我们可以在不同的计算机系统和软件平台上准确地表示和处理这些字符,以实现跨语言的交流和数据交换。
二、Unicode字符集的应用场景和技术1. 系统和应用程序国际化Unicode字符集广泛应用于操作系统、编程语言和应用程序的国际化开发中。
通过使用Unicode字符集,我们可以轻松地将软件界面和用户交互语言切换到不同的语言环境,以满足用户的多语言需求。
在编程中,我们可以使用Unicode编码来表示和处理各种字符,包括字母、数字、标点符号、特殊符号等。
2. 字符串处理和文本处理在字符串处理和文本处理中,Unicode字符集也扮演着重要角色。
使用Unicode 字符集可以确保正确地处理和显示各种字符,避免因编码问题导致的乱码和错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unicode通用字符集Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
1990年开始研发,1994年正式公布。
随着计算机工作能力的增强,Unicode 也在面世以来的十多年里得到普及。
Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standard,目前第五版由Addison-Wesley Professional出版unicode,ISBN-10: 0321480910)对外发表。
2006年7月的最新版本的Unicode 是5.0版本。
2005年3月31日推出的Unicode 4.1.0 。
另外,5.0 Beta于2005年12月12日推出,5.2版本(unicode standard)于2009年10月1日正式推出,以供各会员评价。
目前Unicode标准,6.1版已发布(2012年1月31日)。
在unicode联盟网站上可以查看完整的6.1的核心规范。
Unicode定义了大到足以代表人类所有可读字符的字符集。
Java语言就用到了Unicode编码,从而实现了该语言的国际通用性。
编辑本段Unicode 的编码和实现大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。
编码方式Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
Unicode 用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。
码位就是可以分配给字符的数字。
UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。
UCS-2用两个字节编码,UCS-4用4个字节编码。
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。
前者开发的ISO/IEC 10646 项目,后者开发的统一码项目。
因此最初制定了不同的标准。
1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。
于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。
从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。
两个项目仍都存在,并独立地公布各自的标准。
但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。
在发布的时候,Unicode一般都会采用有关字码最常见的字型,但ISO 10646一般都尽可能采用Century字型。
UCS-4根据最高位为0的最高字节分成2^7=128个group。
每个group再根据次高字节分为256个平面(plane)。
每个平面根据第3个字节分为256行(row),每行有256个码位(cell)。
group 0的平面0被称作BMP(Basic Multilingual Plane)。
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
每个平面有2^16=65536个码位。
Unicode计划使用了17个平面,一共有17*65536=1114112个码位。
在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。
其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。
所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。
平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。
平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。
代理区的目的用两个UTF-16字符表示BMP以外的字符。
在介绍UTF-16编码时会介绍。
如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2048=99089。
余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个字符,其中包括71226个汉字。
平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。
平面2的43253个字符都是汉字。
平面0上定义了27973个汉字。
实现方式在Unicode中:汉字“字”对应的数字是23383。
在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。
UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。
例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。
UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。
“汉字”的UTF-8编码需要6个字节。
“汉字”的UTF-16编码需要两个WORD,大小是4个字节。
“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
UTF-8UTF-8以字节为单位对Unicode进行编码。
从Unicode到UTF-8的编码方式如下:UTF-8的特点是对不同范围的字符使用不同长度的编码。
对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
UTF-8编码的最大长度是4个字节。
从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。
Unicode的最大码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。
0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。
将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用用4字节模板了:11110xxx10xxxxxx 10xxxxxx 10xxxxxx。
将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
UTF-16UTF-16编码以16位无符号整数为单位。
我们把Unicodeunicode编码记作U。
编码规则如下:如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。
例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。
用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。
按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。
可见,第一个WORD的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。
第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。
为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):高位替代就是指这个范围的码位是两个WORD的UTF-16编码的第一个WORD。
低位替代就是指这个范围的码位是两个WORD的UTF-16编码的第二个WORD。
那么,高位专用替代是什么意思?我们来解答这个问题,顺便看看怎么由UTF-16编码推导Unicode编码。
如果一个字符的UTF-16编码的第一个WORD在0xDB80到0xDBFF之间,那么它的Unicode编码在什么范围内?我们知道第二个WORD的取值范围是0xDC00-0xDFFF,所以这个字符的UTF-16编码范围应该是0xDB80 0xDC00到0xDBFF 0xDFFF。
我们将这个范围写成二进制:1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111按照编码的相反步骤,取出高低WORD的后10位,并拼在一起,得到1110 0000 0000 0000 0000 - 1111 1111 1111 1111 1111XML即0xe0000-0xfffff,按照编码的相反步骤再加上0x10000,得到0xf0000-0x10ffff。