首页技术文章正文

Java培训之IO流&网络编程(一)

更新时间:2017-05-31 来源:黑马程序员Java培训学院 浏览量:

1、编码表:|--由来:计算机只能识别二进制数据,早期由来的是电信号,为了方便计算机能识别各个国家的文字,就将各个国家的文字用数字来表示,并一一对应,形成了编码表。
|--常见码表:
|--ASCII:一个字节中7位就已经可以表示英文中的内容了。
|--ISO8859-1:包含了ASCII,同时用了一个字节的最高位。
|--GB2312/GBK:用两个字节表示各种文字。()
|--Unicode:国际标准码表,全部用两个字节表示各种文字(java中默认的就是用这个码表,对于字符串使用的本地默认码表是GBK)
|--UTF-8:一个字节能存的就用一个字节存储,两个字节存不了的用三个字节存储。在编码的时候会给每个字节加个标示头。这样做的好处是:标示相当清楚,只要读取标示就可以知道该怎么去查表。
Eg:01010101 11010101 10101111 11101101 10101010 10111100
当读取到第一个字符时,就回去查ASCII码表,因为0开头就是用一个字节存储的,当读第二个字节时,110开头的时继续读下一个字节,因为UTF-8有固定的标示头110开头代表是存两个字节,当读到1110时会继续读三个字节,如果是GBK读这些,读到第一个字节时也会查表。因为ASCII码表兼容,当读到1时会继续读下一个字节。
面试题:char类型中能不能存储一个汉字?
Eg:char ch='a';就是两个字节,只是最高八位全部都是0;
Char类型变量是用来存储Unicode编码的字符,该编码字符集中包含了汉字,
所以char类型的变量是可以存储汉字,不过如果某些特殊的汉字没有被包含在该字符集中,那么这个char类型变量中就不能存储这个汉字,这些都是因为Unicode编码表全部都是用两个字节表示各种文字。
|--编码:字符串变成字节数组(把看的懂的变成看不懂的)
编码错了是不可能改正的,如果编对了解错了还是有可能改正的。
实现代码:
|--解码:字节数组变成字符串(把看不懂的变成看的懂的)
Eg:客户端发送你好到服务端
你好--------->你好 -60,-29,-70,-61------>ISO8859-1进行解码---->????------->对它进行编码------->-60,-29,-70,-61--->对它进行解码----->你好
|--联通问题:
实现代码:
public static void main(String[] args) throws UnsupportedEncodingException {
String str="联通";
/*
 *  11000001
10101010
11001101
10101000
通过这里发现联通对应的四个字节的开头正好是UTF-8对应存储两个字节的开头,所以它在解码的时候按照UTF-8的方式进行解码
出现了乱码
 * */
byte[] buf=str.getBytes("GBK");
for(byte b:buf){
System.out.println(Integer.toBinaryString(b&0xff));//获取二进制的方式,已经忘记了!注意复习!
}
}

本文版权归黑马程序员Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:黑马程序员Java培训学院
首发:http://javaee.itheima.com/
分享到:
在线咨询 我要报名
和我们在线交谈!