我是靠谱客的博主 过时心情,最近开发中收集的这篇文章主要介绍黑马程序员:字符编码介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------

字符编码:

字符流的出现为了方便操作字符

更重要的是加入了编码转换

通过子类转换流来完成
InputStreamReader
OutputStreamWriter
在两个对象进行构造的时候可以加入字符集
提示:除了这两个对象可以加入字符集外,还有PrintStream、PrintWriter,但是它们是打印流,只用于打印

常见编码表:
ASCII:美国标准信息交换码。用一个字节的7位可以表示
ISO8859-1:拉丁码表。欧洲码表。用一个字节的8位表示 前1个高位是1
GB2312:中国的中文编码表 前2个高位都是1
GBK:中国的中文编码表升级,融合了更多的中文文字号,一个文字占两个字节
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode,16位
UTF-8:最多用三个字节来表示一个字符,1个够就用1个,不够变2个,再不够就3个

编码:字符串变成字节数组(看得懂的变成看不懂的)
String -> byte[]      str.getBytes(charsetName);
解码:字节数组变成字符串(看不懂的变成看得懂的)
byte[] -> String new String(byte[],charsetName);

编码错了,就解不出来了,解码错了,可以对其再次进行编码(这里要注意编码查的是几个字节,比如iso8859-1是1个字节,所以对其再次编码也用iso8859-1的时候读取的也是一个字节,就能读出原编码,若解码错误的值为???,而用utf-8对其编码的时候,一个?号,就会被认为是3个字节,从而???编码后有9个字节,这样就不能通过再此编码解码恢复数据了),再从新解码

示例:
String s = "你好";
byte[] b = s.getBytes("GBK");  //编码
String str = new String(b,"iso8859-1"); //解码,这部解错了,iso8859-1是欧洲码,不支持中文
byte[] newb = str.getBytes("iso8859-1"); //再次编码,因为str原编码是iso8859-1,1个字符占1个字节,对其进行再次编码的时候也是1次差一个字节,所以就可以再次编码
System.out.println(Arrays.toString(newb));
String newstr = new String(b,"GBK"); //解码
System.out.println(Arrays.toString(newstr));

特殊例子:
联通、联系、鞋
在windows中,打开notepad,内容为“联通”,保存关闭后再打开,就会出现乱码
原因是,本身应该通过GBK解码的,结果变成UTF-8解码,为什么会通过UTF-8解码呢?
因为notepad在解码的时候发现编码二进制头是1,GBK开头是1,再接着,第一个字节开头是110,第二个字节开头是10,符合UTF-8的编码规律,所以就用UTF-8解码了,结果就出现了乱码
注:在windows的notepad中,写入的文字都符合UTF-8解码规律的时候才会出现这种情况,只要有一个不符合,就不会出现
通过代码解释原理部分?

String str = "联通";
byte[] arr = str.getBytes("GBK");
for (byte b : arr)
{
	System.out.println(Integer.toBinaryString(b&255)); //b&255,取后八位
}
结果:
11000001
10101010
11001101
10101000


---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net

最后

以上就是过时心情为你收集整理的黑马程序员:字符编码介绍的全部内容,希望文章能够帮你解决黑马程序员:字符编码介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部