zoukankan      html  css  js  c++  java
  • 编码格式

    计算机常见的编码格式
    ASCII,ISO-8859-1,GB2312,GNK,UTF-8,UTF-16等
    ASCII:总共有128个字符,通过键盘输入就能显示;
    ISO-8859-1:总共能表示256个字符,扩展了ASCII编码,但是仍然是的单字节编码;
    GB2312:双字节编码,包含6763个汉字
    GBK:扩展GB2312,加入更多汉字,兼容GB2312
    几种编码格式的比较:
    对中文字符几种编码格式都能处理,GB2312与GBK编码规则类似,但是GBK范围更大,它能处理所有汉字字符,所以GB2312与GBK比较,应该选择GBK。UTF-16与UTF-8都是处理Unicode编码,它们的编码规则不太相同,相对来说UTF-16编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好。Java的内存编码就采用UTF-16编码,但是它不适合在网络之间传输,因为网络传输容易损坏字节流,一旦字节流损坏就很难恢复,相比较而言UTF-8更适合玩过传输。
     
    String s = “这是一段中文字符串”;
    byte [] b = s,getBytes(“UTF-8“);
    String n = new String(b,”UTF-8”);
     
    0.字符集&编码
    字符集:字符的集合;
    常见的字符集有:ISO-8859-1  ISO-8859-16 GB2312  GBK  GB18030  Unicode
    字符集只定义了每个符号对应的编号,这个编号与计算机没有任何关系。字符集不规定每个字符在计算机中用几个字节表示,这个这个编码encoding的范畴。
     
    编码:指一个字符在计算机中怎样存放,是采用一个字节,还是采用两个字节,还是采用不定长的字节?单字节,双字节,多字节。
    GB2312,GBK,Big5一般既是字符集,又是编码。而unicode字符集是字符集
    判断字符数等需要从头开始遍历,效率较低。而保存在磁盘中则以UTF-8,这样可以保证空间的节省。
     
     
    先做一个小小的试验:
           在一个文件夹里,把一个txt文本(文本里包含“今天的天气非常好”这句话)分别另存为ansi、unicode、utf-8这三种编码的txt文件。然后,在该文件夹上点击右键,选择“搜索(E)…”。
    搜索“天气”二字,可以搜索出ansi和unicode这两种编码的txt文件,搜索不出utf-8编码的文件。
    原因:
    1.中文操作系统默认ansi编码,生成的txt文件默认为ansi编码,所以,可以搜索出来。
    2.unicode是国际通用编码,所以,可以搜索出来。
    3.utf-8编码是unicode编码在网络之间(主要是网页)传输时的一种“变通”和“桥梁”编码。utf-8在网络之间传输时可以节约数据量。所以,使用操作系统无法搜索出txt文本。
     
    按照utf-8创始人的愿望:
    端(unicode)——传输(utf-8)——端(unicode)
    但是,后来,许多网站开发者在开发网页时直接使用utf-8编码。
    端(utf-8)——传输(utf-8)——端(utf-8)
     
           所以,在浏览器上看到的编码是:unicode(utf-8)。正因为在浏览器上这么并列地列出unicode(utf-8),造成许多网友(甚至不少程序员)误认为unicode=utf-8。其实,按照utf-8创始人的原意,在开发网页时使用utf-8编码是错误的做法,并且,早期的浏览器也不支持解析utf-8编码。但是,众人的力量是巨大的,微软不得不“趋炎附势”,在浏览器上支持解析utf-8编码。
           问题是:utf-8编码影响了网站开发者,或者说,网站开发者“扩展”了utf-8编码的使用范围。但是,网站开发者仍然无法影响各类文档的开发者,所以,word文档和一些国际通用的文档仍然使用unicode编码而不使用utf-8编码。
    比如:“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。
     
           在中文和日文操作系统里生成的(txt和xml)文件的编码虽然都是ansi,但是,在简体中文系统下,ansi 编码代表 GB2312 编码,在日文操作系统下,ansi 编码代表 JIS 编码。不同 ansi 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ansi 编码的文本中。
           结论:国际文档(txt和xml)使用unicode编码是正宗做法;操作系统和浏览器都能够“理解”unicode编码。浏览器“迫于压力”才“理解”utf-8编码。但是,操作系统有时只认unicode编码。
    Unicode与Unicode big endian的区别:你吃鸡蛋时先吃小头还是先吃大头?Unicode与Unicode big endian的区别就是在编码时小头优先与大头优先的区别。“随波逐流”使用Unicode就OK了。
    我(不是程序员)这几年一直因为编码问题,感到非常困惑,查了许多资料,在国际文档的实际应用中也遇到过许多问题,所以,“感性”地总结了上述观点,不一定准确(或者说,不一定正确)。
     
    属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 
    很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。
     
    汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
     
    这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为"00 61"。 
    需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
     
    考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。 
    注意,虽然说,但那只是相对于unicode编码来说,。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。
     
     
    在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。 
    这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。
    这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。
     
    因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
     
    Unicode和UTF-8的关系:
    Unicode是字符集,而UTF-8则是Unicode字符集对应的计算机的存储格式。UTF-8则特指计算机内部的存储编码。
     
     
  • 相关阅读:
    Hadoop 回收站
    Sparkstreaming reduceByKeyAndWindow(_+_, _-_, Duration, Duration) 的源码/原理解析
    spark streaming updateStateByKey 用法
    spark streaming 直连 kafka 分区
    sparkStreaming 练习
    json demo
    spark与flume整合
    spark sql 入门
    【面试】c++单例模式
    Python高级笔记(十一)装饰器【面试】
  • 原文地址:https://www.cnblogs.com/novalist/p/6398151.html
Copyright © 2011-2022 走看看