java IO流 编码

这了先空着以后再写。。

1. 什么是字符

    字符就是文字与符号的统称。

    例如:“你好”,“nihao”,"hello world","@#!&%$",...

2. 什么是字符集

   字符集就是各种字符的集合

3. 什么是字符集编码

    字符集编码就是为字符集中的每一个字符赋予对应的一串唯一的二进制代码。比如“我”的二进制编码(GBK)就是11001110 11010010 。

public class TestGBK
{
	public static void main(String[] args)
	{
		String string="我";
		byte[] bytes=string.getBytes();
		for (byte b : bytes)
		{
			System.out.print(Integer.toBinaryString(b&0xff)+" ");
		}
	}
}

运行结果:

11001110 11010010

4. 常用字符编码

字符编码有好多种,每个国家都有自己规定的字符编码。

在中国,常有的字符编码有:

   ASCII编码,GBK编码(包括简体,繁体字),GB2312编码(简体中文字符集),BIG(繁体中文字符集),Unicode编码,UTF-8编码。

5. ASCII码(英文字符编码)

ASCII编码时美国根据自己的26个字母定制的一种编码,也是目前用得最普遍的的编码,在DOS和Windows系统中都使用了ANSI码。ASCII编码共占一个字节,最前面的1位没有用来编码,统一规定为0,剩下的7位用来编码。ASCII编码一共规定128个字符的编码,其中包括33个控制码,一个空格码,和94个形象码。形象码中包括了英文大小写字母,阿拉伯数字,标点符号等。

6. GB2312码(简体中文字符编码)

GB2312码是 1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。GB2312 是对 ASCII 的中文扩展。

7. BIG5码(繁体中文字符编码)

BIG5编码是台湾等地区的繁体中文标准字符集采用双字节编码,共收录13053个中文字,1984年实施。

8. GBK编码(中文字符编码)

GBK编码是1995年12月发布的汉字编码国家标准是对GB2312编码的扩充对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字

9. Unicode字符集(国际标准字符集)

而世界上有各种各样的编码语言,每个字符表示的编码字符都是不一样的。为了统一编码,为了满足跨语言跨平台的文本信息转换。将世界各种语言的每个字符定义一个唯一的编码,这些字符组成Unicode字符集,这样世界上所有的字符都可以用独一无二的编码来表示。Unicode 只是字符集,而没有编码方式。

10. UTF-8编码

UTF-8编码时Unicode字符集的一种编码表示

如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。

11. 编码历史起源

作者:于洋
链接: https://www.zhihu.com/question/23374078/answer/69732605
来源:知乎
(1) 中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
(2) 汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
(3) 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
(4) 每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
(5) 终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 Unicode,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 Unicode这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
(6) Unicode在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。
(7) 于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。

import java.io.UnsupportedEncodingException;

public class EcodeDemo
{
	public static void main(String[] args) throws UnsupportedEncodingException
	{
		String string="中国ABC";
		//把字符串生成字节数组,用的是项目默认的编码(gbk)
		//gbk中文占两个字节,英文占用一个字节
		byte[] bytes=string.getBytes();
		printfByteArray(bytes);
		//utf-8中文站3个字节,英文占用一个字节
		byte[] bytes1=getBytes(string,"utf-8");
		printfByteArray(bytes1);//e4 b8 ad e5 9b bd 41 42 43 
		//java是双字节编码,是utf-16be编码
		//中文占用两个字节,英文也占用两个字节。
		//4e 2d 56 fd 0 41 0 42 0 43 
		byte[] bytes2=getBytes(string, "utf-16be");
		printfByteArray(bytes2);
		/*
		 当你的字节序列式某种编码时,这个时候想把字节序列变成字符串,
		 也需要用这种编码方式,否则会出现乱码
		 */
		String str1=new String(bytes);//使用默认的编码把字符数组转换成字符串
		System.out.println(str1);
		//错误的转换方式,没有提供编码时,会使用默认的编码来解码(gbk)
		String str2= new String(bytes1);//把utf-8的字符序列转换成字符串,会乱码
		System.out.println(str2);//转换错误:涓浗ABC
		//正确的转换方式,提供字节序列的编码
		String str3= new String(bytes1,"utf-8");
		System.out.println(str3);//转换正确
		String str4=new String(bytes2,"utf-16be");
		System.out.println(str4);
		/*
		 * 文本文件是字节序列,如果在中文的机器上直接创建文本文件时,
		 * 该文本文件只认得ANSI编码,虽然文本文件可以是任意编码的。
		 * */
		
	}
	static byte[] getBytes(String string,String charset) throws UnsupportedEncodingException 
	{
		return string.getBytes(charset);
	}
	static void printfByteArray(byte[] bytes)
	{
		for (byte b : bytes)
		{
			//把字节转换成int,然后以十六进制显示
			//int类型占32位,byte占8位,显示的时候只需要显示后八位就可以了,
			//与上0xff:
			System.out.print(Integer.toHexString(b&0xff)+" ");
		}
		System.out.println();
	}
}

运行结果:

d6 d0 b9 fa 41 42 43 
e4 b8 ad e5 9b bd 41 42 43 
4e 2d 56 fd 0 41 0 42 0 43 
中国ABC
涓浗ABC
中国ABC
中国ABC

参考:

字符编码是什么?

汉字字符集编码查询

编码

Unicode 和 UTF-8 有何区别?


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值