编码格式

摘要:
字符集没有指定每个字符在计算机中表示的字节数,这是编码类别。注意,尽管如此,这仅与unicode编码有关,。这是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则特指计算机内部的存储编码。
 
 

免责声明:文章转载自《编码格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇新员工自缢身亡,华为又站到了风口浪尖推荐Firefox截图插件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

XML文件的解析--libxml库函数解释

[c语言]XML文件的解析--libxml库函数解释 2009-09-02 13:12 XML文件的解析--libxml库函数解释 libxml(一)                                     摘要 Libxml是一个有免费许可的用于处理XML、可以轻松跨越多个平台的C语言库。这个指南提供它的基本函数的例子。绪论 Lib...

LaTex支持中文的三种方式(首推第一种)

转自:https://blog.csdn.net/z_feng12489/article/details/90449495 我们知道 Latex 一般用 CJK 和 CTEX 宏包支持中文编辑,CJK 和 CTEX 的默认编码是 GBK,而 windows 下的默然编码就是 GBK,因此 CJK 和 CTEX 不需要特殊配置就可以直接支持中文 Latex...

mysql修改表、字段、库的字符集

在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET=gb2312 用这个导入 mysql -uroot -p --default-character-set=gb2312 databasename>E:o...

每个Web开发者都应该知道的关于URL编码的知识

  本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们经常遇到的问题及其解决方案。本文并不特定于某类编程语言,我们在Java环境下阐释问题,最后从Web应用的多个层次描述如何解决URL编码的问题来结尾。    简介   当我们每天上网冲浪时,有一些技术我们无时无刻不在面对。有数据...

使用SQL语句修改Mysql数据库字符集的方法

使用SQL语句修改Mysql数据库字符集的方法   修改库: alter database [$database] character set [$character_set] collate [$collation_name] 注:[$database]为数据库的库名。[$character_set]为字符集名称。[$collation_name]为...

vim为何打开文件乱码,而且之后setenc还是乱码?附带实用vimrc一份

在 Vim 中,有四个与编码有关的选项,它们是: ''fileencodings''、 ''fileencoding''、 ''encoding'' 和 ''termencoding''。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个 Vim 用户都应该明确这四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。  * enc...