----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
字符流的出现为了方便操作字符
更重要的是加入了编码转换
通过子类转换流来完成
InputStreamReader
OutputStreamWriter
在两个对象进行构造的时候可以加入字符集
(还有两个能加入编码表 printStream和printWriter 但只能打印,不能读取)
编码表的由来:
计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表。
常见的编码表
ASCII:美国标准信息交换码,用一个字节的7位可以表示。
ISO8859-1:拉丁码表,欧洲码表,用一个字节的8位表示。
GB2312:中国的中文编码表
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。让所有文字都用两个字节表示,Java语言使用的就是Unicode。
UTF-8:最多用三个字节来表示一个字符。
/*
编码:字符串变成字节数组。
解码:字节数组变成字符串。
String-->byte[]; str.getBytes(charsetName);
byte[] -->String: new String(byte[],charsetName);
*/
import java.util.*;
class EncodeDemo
{
public static void main(String[] args)throws Exception
{
String s = "哈哈";
byte[] b1 = s.getBytes("GBK");
System.out.println(Arrays.toString(b1));
String s1 = new String(b1,"utf-8");
System.out.println("s1="+s1);
//对s1进行iso8859-1编码。
byte[] b2 = s1.getBytes("utf-8");
System.out.println(Arrays.toString(b2));
String s2 = new String(b2,"gbk");
System.out.println("s2="+s2);
}
}
出现乱码,可以将“你好”放进去,若出的是??,则
用GBK编码,用UTF-8解码;
若出现的是“浣cai”,则用UTF-8编码,GBK解码。
字符编码
编码:字符串变成字节数组
解码:字节数组变成字符串
String-->byte[]; str.getBytes(charsetName);
byte[]-->String; new String(byte[],charsetName);
/*
编码:字符串变成字节数组。
解码:字节数组变成字符串。
String-->byte[]; str.getBytes(charsetName);
byte[] -->String: new String(byte[],charsetName);
*/
import java.util.*;
class EncodeDemo
{
public static void main(String[] args)throws Exception
{
String s = "哈哈";
byte[] b1 = s.getBytes("GBK");
System.out.println(Arrays.toString(b1));
String s1 = new String(b1,"utf-8");
System.out.println("s1="+s1);
//对s1进行iso8859-1编码。
byte[] b2 = s1.getBytes("utf-8");
System.out.println(Arrays.toString(b2));
String s2 = new String(b2,"gbk");
System.out.println("s2="+s2);
}
}
若解码用错了码表,可以将解码出现的字符,转换成字节,再用其他码表解码。(例如iso8859-1和GBK之间,但utf-8和GBK则不行,因为他们都识别中文)
客户端提交的字符,若是get提交,编码错误则只能重新编码再解码;
若为post提交的话,则可以直接设置字符编码来解决。
字符编码-联通
class EncodeDemo2
{
public static void main(String[] args) throws Exception
{
String s = "?";
byte[] by = s.getBytes("gbk");
for(byte b : by)
{
System.out.println(Integer.toBinaryString(b&255));
}
System.out.println("Hello World!");
}
}
utf-8自定的头,用来区别一次读取几个字节
若为一个字节,则头位为0;
若两个,则第一个字节头位为110,第二个字节头位为10;
若三个字节,则头位依次为:
1110
10
10
加入编码表后,别忘了抛出异常
只取后八位,则x&255
“联通”二字,用GBK编码,符合UTF-8的编码格式,记事本会自动按照UTF-8解码。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------