当前位置: 代码迷 >> 综合 >> JAVA 文件编码学习
  详细解决方案

JAVA 文件编码学习

热度:88   发布时间:2024-01-21 14:44:59.0

ANSI,GBK,UTF-8,UTF-16LE,UTF-16BE

2010-08-23 18:35

ANSI
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS  等各自的编码标准。这些使用  2  个字节来代表一个字符的各种

汉字延伸编码方式,称为 ANSI  编码。在简体中文系统下, ANSI  编码代表  GB2312  编码,在日文操作系统下, ANSI  编码代表  JIS  编码。

不同 ANSI  编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段  ANSI  编码的文本中
在Ansi 上各国对 ascii 码都进行庞大的互不兼容 的扩充,大陆对 Ansi 的扩充是 ascii->GB2312( 简体中文 )->GBK( 繁体中文 )->GB18030( 加了少

数民族语 言) ,台湾对 Ansi 的扩充是 ascii->BIG5 , GB2312 和 BIG5 互不兼容。

GBK
GBK编码 (Chinese Internal Code Specification) 是中国大陆制订的、等同于 UCS 的新的中文编码扩展国家标准。 gbk 编码能够用来同时

表示繁体字和简体字,而gb2312 只能表示简体字, gbk 是兼容 gb2312 编码的。 GBK 工作小组于 1995 年 10 月,同年 12 月完成 GBK 规范。该编码标准

兼容GB2312 ,共收录汉字  21003 个、符号 883 个,并提供 1894 个造字码位,简、繁体字融于一库。

iso8859-1
属于单字节编码,最多能表示的字符范围是0-255 ,应用于英文系列。比如,字母 'a' 的编码为 0x61=97 。
很明显,iso8859-1 编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很

多时候,仍旧使用iso8859-1 编码来表示。而且在很多协议上,默认使用该编码。

BIG5编码
是目前台湾、香港地区普遍使用的一种繁体汉字的编码标准,包括440 个符号,一级汉字 5401 个、二级汉字 7652 个,共计 13060 个汉字。

BIG5又称大五码或五大码, 1984 年由台湾财团法人信息工业策进会和五间软件公司宏碁  (Acer) 、神通  (MiTAC) 、佳佳、零壹  (Zero One) 、

大众 (FIC) 创立,故称大五码。 Big5 码的产生

UTF-8
UTF:UCS Transformation Format.考虑到 unicode 编码不兼容 iso8859-1 编码,而且容易占用更多的空间:因为对于英文字母, unicode 也

需要两个字节来表示。所以unicode 不便于传输和存储。因此而产生了 utf 编码, utf 编码兼容 iso8859-1 编码,同时也可以用来表示所有语言

的字符,不过,utf 编码是不定长编码,每一个字符的长度从 1-6 个字节不等。另外, utf 编码自带简单的校验功能。一般来讲,英文字母都是

用一个字节表示,而汉字使用三个字节。

UTF-16LE UTF-16BE
big endian和 little endian 是 CPU 处理多字节数的不同方式。例如 “ 汉 ” 字的 Unicode 编码是 6C49 。那么写到文件里时,究竟是将 6C 写在

前面,还是将49 写在前面?如果将 6C 写在前面,就是 big endian 。如果将 49 写在前面,就是 little endian 。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头 (Big-Endian) 敲开还是从小头 (Little-Endian) 敲开,由

此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

我们一般将endian 翻译成 “ 字节序 ” ,将 big endian 和 little endian 称作 “ 大尾 ” 和 “ 小尾 ” 。


Unicode(UCS)
Unicode编码后的大小是一样的 . 例如一个英文字母  "a"  和 一个汉字  " 好 " ,编码后都是占用的空间大小是一样的,都是两个字节
Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容 iso8859-1 编

码的,也不兼容任何编码。不过,相对于iso8859-1 编码来说, uniocode 编码只是在前面增加了一个 0 字节,比如字母 'a' 为 "00 61" 。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK 不是定长编码),而 unicode 又可以用来表示所有字符,所以在很多软件内部是使

用unicode 编码来处理的,比如 java 。
在实际应用中UTF-16BE 的编码内容正好和 UNICODE 高低位相反,而 UTF-16LE 与 UNICODE 的编码内容完全一致。