大家好,我说的是北君。最近看了《狂飙》,小姑子气场十足!凉爽的!万国码(Unicode、UniversalCode、Unicode)是计算机上使用的一种字符编码。Unicode的创建是为了解决传统字符编码方案的局限性。它为每种语言中的每个字符设置了统一唯一的二进制编码,以满足跨语言、跨平台的文本转换和处理的要求。简介什么是字符集?字符集当然是字符的集合,那么字符呢?您在本文中看到的每一个字母、中文或标点符号都是一个字符。在早期的计算器时代,计算机支持的字符集只有ASCII,对应的字符可以满足当时的使用需要。但是随着计算机的发展,需要在计算机上显示的内容也越来越复杂,而且每个国家都不一样。厂商有自己的执行标准,但没有一个能兼容世界上所有的字符,所以产生了各种字符集,如ASCII、ISO-8859-1、GB2312、BIG5等。为什么要使用字符编码?为了实现人与计算机的交流,我们只知道字符,而计算机只知道二进制数据。字符编码是将字符转换成机器码进行存储和使用的一种技术手段。Unicode是一种字符集,而不是一种编码。字符集字母、汉字、数字、标点符号、图形符号等字符的集合。表示字符与二进制位的映射关系ASCII技术特点:7位(bits)表示一个字符,共128个字符,字符值从0到127,其中32到126为可打印字符。扩展字符集:7位编码字符集只能支持128个字符。为了表示更常见的欧洲字符,对ASCII进行了扩展。ASCII扩展字符集用8位(bits)来表示一个字符,共256个字符。ASCII扩展字符集:由ASCII字符集扩展而来。扩展符号添加了表格符号、计算符号、希腊字母和特殊拉丁符号。GB2312GB2312是中国国家标准的简体中文字符集。它收录的汉字已经覆盖了99.75%的使用频率,基本满足了计算机处理汉字的需要。在中国和新加坡广泛使用。技术特点(1)分区表示:在GB2312中,接收到的汉字是“分区”的,每个区域包含94个汉字/符号。这种表示也称为区号。各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;区域10-15和88-区域94未编码。(2)双字节表示法两个字节中的第一个字节为第一个字节,后一个字节为第二个字节。习惯上称第一个字节为“高字节”,第二个字节为“低字节”。“高字节”使用0xA1-0xF7(01-87区域的区号加0xA0),“低字节”使用0xA1-0xFE(0xA0加01-94)。UnicodeUnicode是计算机上使用的一种字符编码。它为每一种语言的每一个字符设置了统一唯一的二进制编码,以满足跨语言、跨平台的文本转换和处理的要求。Unicode标准总是使用十六进制数,并在书写时加上“U+”作为前缀,例如字母“A”编码为0x0041,字符“”编码为0x20AC,所以“A”、“”的编码写成“U+0041”、“U+20AC”。字符集编码字符对应于二进制字节表示后的编码规则和存储形式。ASCIIGB2312UTF-8ASCII、GB2312是字符集和字符编码unicode5层模型Unicode编码模型包括五层:层名称函数结果描述1抽象字符表ACR字符范围2数字字符集CSS字符数unicode字符集3字符编码方式CEF码element序列UTF-8、UTF-16、UTF-324字符编码方案CES物理编码字节序列5传输编码语法TES网络传输编码base64Unicode字符集分为基本多语言平面和辅助平面,共17个平面(或17个区域,编号为0-16),每个平面有216个即65536个码位,一共65536*17=1,114,112个码位,码位空间从U+000000到U+10FFFF。每个码位对应一个字符(有的是非字符或保留码位),但一个字符可能有多个码位(如?)unicode编码包括UTF8、UTF16、UTF32,至少需要1、2、和4个码位分别用字节来存储一个字符编码unicode是字符的表示,utf8是字符的存储形式,或者说unicode和utf8的存储实现下面是unicode和unf8的映射表,我们通过unicode字符的codepoint(对应16进制编码)可以找到对应的utf-8格式进行编码转换,最终实现物理存储。unicodeutf-8000000-00007F0xxxxxxx000080-0007FF110xxxxx10xxxxxx000800-00FFFF1110xxxx10xxxxxx10xxxxxx010000-10FFFF11110xxx10xxxxxx10xxxxxx10xxxxxx那么如何把unicode字符转成utf8编码呢?例如“I”对应unicode为\u6211,可通过网站转为二进制:0110001000010001根据上表取值范围可确定为:000800-00FFFF-1110xxxx10xxxxxx10xxxxxx转换后,结果为:111001101000100010010001转换为十六进制:E68891,可以通过UE等编辑工具切换为十六进制,可以看到“I”转换后的编码也是这样。你有没有想过为什么GBK可以是一个字符?集合也可以是字符编码?其实,当把字符映射成相应的二进制数据时,我们可以直接将它们存储在计算机中,但是unicode作为一种统一的编码,基本上包括了目前常用的所有字符,而这些字符并不都是由两个字节组成的。比如前面提到的?,这里怎么判断一个字符从哪个字节开始呢?这里引用utf编码来实现,既减少了字符空间的占比,又提高了字符编码的效率。BOMBOM是字节顺序标记的首字母缩写词。它是UTF编码方案中用来标识编码的标准标记。在UTF-16中,原本是FFFE,变成UTF-8后,就变成了EFBBBF。这个标志是可选的,因为UTF8字节是没有顺序的,所以可以用来检测一个字节流是否是UTF-8编码的。Java中的unicode在java中,我们用\u开头来表示unicode编码,比如上面的\u6211,就是“我”的意思。看下面的代码,你认为会输出什么?publicstaticvoidmain(String[]args)throwsIOException{////\u000dSystem.out.println("HelloWorld");}当然是“HelloWorld”,不要以为//后面的所有代码都会被解析为注释,前提是没有换行符,但是\u000d会被解释为换行符,这样后面的代码就会被解析为换行,所以才会有这样的输出结果。编译java源文件的命令如下:javac./Main.java-encodingutf-8window环境默认编码为gbk。要知道java作为一种高级的静态语言,需要经过编译才能被JVM加载使用。它会对源代码进行词法分析、句法分析、语义分析等,最后生成class文件,才能被JVM加载。源文件中以\u开头的字符在这个过程中被解析和处理。结束语Unicode作为世界统一编码,经历了很多变化。本文主要使用unicode,让大家对字符集和字符编码有一个简单的了解。
