---------------------- 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