浅谈java使用指定字符集编码,以及常见的字符集

  • Post author:
  • Post category:java



问题的引入:在InputStreamReader(OutputStreamWriter)的构造方法中,有指定字符集编码,那么什么是字符集?有哪些常用的字符集?怎么用字符集进行编码?


一   什么是字符集?



字符:字符(Char)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。



字符集:字符集(Charset)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。


二  有哪些常用的字符集?


1.ASCII:



ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的          一套电脑编码系统。



包含内容:


控制字符:回车键、退格、换行键等。

可显示字符:英文大小写字符、阿拉伯数字和西文符号。



技术特征:


7位(bits)表示一个字符,共128字符,字符值从0到127,其中32到126是可打印字符。

集扩展字符集:

7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位      (bits)表示一个字符,共256字符。

ASCII扩展字符集:它是从ASCII字符集扩充出来的,扩充后的符号增加了表格符号、计算符号、希腊字母和特殊的拉丁符号。


2.GB2312:



GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。



包含内容


GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

技术特征

(1)分区表示:

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。

(2)双

字节

表示

两个

字节

中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一

字节

为“高字节” ,而称第二字节为“低字节”。

“高位

字节

”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。



符集编码举例






以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数

计算机程序

中,高

字节

和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

3.BIG5

编辑


又称

大五码

或五大码,1984年由

台湾

财团法人

信息工业

策进会和五家

软件

公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。

Big5码的产生,是因为当时

台湾

不同厂商各自推出不同的编码,如倚天码、IBM PS55、

王安

码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的

汉字编码

,而

中国

大陆的GB2312编码亦未有收录

繁体中文

字。


字符集特点


Big5字符集共收录13,053个中文字,该字符集在

中国


台湾

使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。


字符集编码方法


Big5码使用了双

字节

储存方法,以两个字节来编码一个字。第一个

字节

称为“高位字节”,第二个字节称为“低位字节”。高位

字节

的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

各编码范围对应的字符类型如下:0xA140-0xA3BF为标点符号、希腊字母及特殊符号,另外于0xA259-0xA261,存放了双音节度量衡单位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E为常用汉字,先按笔划再按部首排序;0xC940-0xF9D5为次常用汉字,亦是先按笔划再按部首排序。


字符集局限性


尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,没有包含日文平假名及片假名字母。

例如

台湾

视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。

4.GB18030

编辑



字符集名称由来



GB 18030的全称是GB18030-2000《信息交换用

汉字编码

字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在

中国市场

上发布的

软件

必须符合本标准。


字符集特点


GB 18030字符集标准的出台经过广泛参与和论证,

GB18030 字符集

来自国内外知名

信息技术

行业的公司,信息产业部和原国家质量技术监督局联合实施。

GB 18030字符集标准解决汉字、日文假名、朝鲜语和

中国少数民族

文字组成的大字符集

计算机编码

问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和

中国少数民族

文字。满足中国大陆、

香港



台湾



日本

和韩国等

东亚

地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家

字符编码

标准(GB2312,GB13000.1)兼容。


字符集编码方法


GB 18030标准采用单

字节

、双字节和四字节三种方式对

字符编码

。单

字节

部分使用0×00至0×7F码(对应于ASCII码的相应码)。双

字节

部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四

字节

部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。


字符集包含内容




字节

部分收录内容主要包括GB13000.1全部CJK汉字20902个、有关标点符号、表意文字描述符13个、增补的汉字和部首/构件80个、双字节编码的

欧元符号

等。 四

字节

部分收录了上述双字节字符之外的,包括CJK统一汉字扩充A在内的GB 13000.1中的全部字符。

5.Unicode


字符集名称由来


Unicode字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的

字符编码

系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2012年1月31日的Unicode 6.1。


字符集特征


Unicode是一种在计算机上使用的

字符编码

。它为每种语言中的每个字符设定了统一并且唯一的

二进制编码

,以满足跨语言、跨平台进行文本转换、处理的要求。


字符集编码方法


Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116 和字符“?”的编码为 20AC16。所以“A”的编码书写为“U+0041”。


字符集UTF-8 编码


UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Tranformation Format,即把Unicode转做某种格式的意思。

UTF-8便于不同的计算机之间使用

网络传输

不同语言和编码的文字,使得双

字节

的Unicode能够在现存的处理单字节的系统上正确传输。

UTF-8使用可变长度

字节

来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或

西里尔字母

等使用2字节来储存,而常用的汉字就要使用3字节。

辅助平面

字符则使用4

字节



UTF-8(8-bit Unicode Transformation Format)是一种针对

Unicode

的可变长度

字符编码

,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个

字节

编码UNICODE

字符

。用在网页上可以同一页面显示

中文简体

繁体及其它

语言

(如

英文

,日文,韩文)。


字符集比较



UTF-16 和 UTF-32 编码


UTF-32、

UTF-16

和 UTF-8 是 Unicode 标准的编码字符集的

字符编码

方案,UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。

三 如何使用字符集编码?



上图是InputStreamReader的构造方法,如果不指定字符集的话,系统会使用本机默认的编码。下面举一个指定ASCII编码的例子。
import java.io.*;

public class Test1 {

	public static void main(String[] args) throws IOException {
		try {
			File file=new File("Test1.txt");
			FileInputStream fis = new FileInputStream(file);		
			//这里就先不用Buffered缓冲区了
			char []buf=new char[(int)file.length()];
			//创建使用ASCII编码的InputStreamReader
			InputStreamReader isr=new InputStreamReader(fis,"ASCII");
			String text=isr.getEncoding();
			System.out.println(text);
			isr.read(buf);			
			FileOutputStream fos=new FileOutputStream(new File("haha.txt"));
			//以ASCII编码的形式上写入
			OutputStreamWriter osw=new OutputStreamWriter(fos,"ASCII");
			osw.write(buf);
		
			isr.close();
			osw.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

用上面代码写出的文件内容与原文件相同,只不过换了一种编码方式,如果在写的时候改成其他编码,则会出现乱码。

转载于:https://www.cnblogs.com/Liang-Blog/p/5750329.html