【黑马程序员】IO输入与输出(二)之字符编码

 ---------------------- android培训java培训、期待与您交流! ----------------------

刚看完了字符编码,感受颇深,以前就对编码这东西不感兴趣,但是现在看了视频,感觉也就是那些东西,不是很难,也许用到的时候才能体会到其中的深意吧,下面是知识点和例子:

1.计算机里只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。

2.字符a对应数字97,这种字符与数字对应的编码规则被称为ASCII(美国标准信息交换码)。它的最高bit位都为0,也就是说这些数字都在0到127之间。

3.中国大陆将每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高位bit都为1,中国大陆为每个中文字符制定的编码规则称为GB2312(国标码)。

4.在GB2312的基础上,对更多的中文字符(包括繁体)进行了编码,Brave♡矮子的编码规则称为GBK。

5.在中国大陆使用的计算机系统上,GBK和GB2312就被称为该系统的本地字符集。

6.中国的“中”字,在中国大陆的编码是十六进制的D6D0,而在中国台湾的编码是十六进制的A4A4,台湾地区对中文字符集的编码规则称为BIG5(大五码)。

7.在一个国家的本地化系统中出现的一个字符,通过电子邮件传送到另一个国家的本地化系统中,看到的就不是那个原始字符了,而是另外那个国家的一个字符或乱码。

8.全球通用的字符编码:

       ISO(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。

Unicode编码的字符都占用两个字节的大小,字符个数不会超过2的16次方(65536),对于ASCII码所表示的字符。只是简单地在ascii码原来占用的一个字节前面,增加一个所有bit为0的字节。

9.UTF-8编码使用两个或三个字节来表示。使用UTF-8的文件,通常都要用EF BB BF作为文件开头的三个字节数据。

10.utf-8的优点:不出现内容为0x00字节,便于应用程序检测数据在传输过程是否发生了错误,直接处理使用ascii码的英文文档。缺点:某些字符需要使用三个字节。

11.中文字符要以国标码(GB2312)打印到屏幕上才正常。

12.写字节不会刷新缓冲区,写字节数组会刷新缓冲区。

13.字符编码举例:

import java.io.*;

 

public class CharCode {

 

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       //将系统缺省字符集改为iso8859-1

       System.setProperty("file.encoding", "iso8859-1");

       //获得java虚拟机环境属性并输出

       System.getProperties().list(System.out);

 

       String strChina = "中国";

       for(int i=0;i<strChina.length();i++){

           //打印中文字符的Unicode码

           System.out.println(Integer.toHexString((int)strChina.charAt(i)));

       }

      

       try {

           byte[] buf = strChina.getBytes();

           //打印中文字符的GB2312码

           for(int i=0;i<buf.length;i++){

              System.out.println(Integer.toHexString(buf[i]));

           }

           //写入到输出流

           for(int i=0;i<buf.length;i++){

              System.out.write(buf[i]);//写入缓冲区

           }

           System.out.println();//会调用flush方法,刷新作用

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }  

    }

}

 

import java.io.IOException;

 

public class CharDecode {

 

    public static void main(String[] args) throws IOException {

       // TODO Auto-generated method stub

       System.out.println("please enter chinese String:");

       byte[] buf = new byte[1024];

       String strInfo = null;

       int pos = 0;

       int ch = 0;

       while(true){

           ch = System.in.read();

           System.out.println(Integer.toHexString(ch));

           switch(ch){

              case '\r':

                  break;

              case '\n':

                  strInfo = new String(buf,0,pos,"gb2312");

                  for(int i=0;i<strInfo.length();i++){

                     System.out.println(Integer.toHexString(strInfo.charAt(i)));

                  }

                  break;

              default:

                  buf[pos++] = (byte)ch;

           }

       }

    }

 

}

 

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值