java编码和流转换编码
2013-12-25 13:01
429 查看
编码表的由来
计算机只能识别二进制数据,为了方便应用计算机,让它可以识别各个国家的文字,就将各个国家的
文字用数字来表示,并一一对应,形成一张表,这就是编码表。
基本编码表介绍
ASCII:美国标准信息交换码:用一个字节的7位表示
ISO8859—1:拉丁码表。欧洲码表:用一个字节的8位表示
GB2312:中国的中文编码表
GBK:中国的中文码表升级版
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,java语言使用的就是unicode,一个字符俩字节
utf-8:最多用三个字节来表示一个字符
编码的转换
编码:字符串变成字节数组 String--->byte[]即str.getBytes(charsetName);
解码:字节数组变成字符串 byte[]--->String即new String(byte[],charsetName)
String s="你好";
byte[]b=s.getBytes();
System.out.println(Arrays.toString(b));
//打印结果为[-28, -67, -96, -27, -91, -67]说明平台默认编码为utf-8
String s1="你好";
byte[]b1=s1.getBytes("gbk");
System.out.println(Arrays.toString(b1));
//打印结果为[-60, -29, -70, -61]因为GBK是用两个字节表示的字符
由上面的例子说明因为编码表的不同所以保存的数据是不一样的,所以对应的解码表不一致的话就会出现乱码问题。
以下面的例子说明
UTF-8 utf.txt 显示(乱码)
你好 你 -28 -67 -96 写入文本 -28 -67 -96 读取(GBK) -28 -67 浣
好 -27 -91 -67 -27 -91 -67 - 96 -27
犲
-91 -67 ソ
出现这种情况就需要转码
String
m="你好";
byte[]p=m.getBytes("utf-8");
String m1=new String(p,"iso8859-1");
System.out.println("m1=="+m1);
//对出现的乱码重新编码解码
byte[]p1=m1.getBytes("iso8859-1");
String m2=new String(p1,"utf-8");
System.out.println(m2);
打印的结果就是 你好
这中情况主要出现在客户端和服务器这种情况,由于tomcat服务器默认编码是iso8859-1.所以客户端使用GBK或
UTF-8这种情况就需要在服务器重新编码解码返回到客户端。有人会说问什么不把服务器的编码编程GBK或者UTF-8
这样就不用编码在解码这一过
4000
程了,实际上一个服务器可能会有多个工程项目,一个用GBK,一个用UTF-8最后还会乱码,所以上述代码就是一个通用的方式。
流转换编码
对上面的理解透彻落后就可以对流进行操作了
这时候要使用OutputStreamWriter 和InputStreamReader
//以特定编码格式写入
OutputStreamWriter osw1=new OutputStreamWriter(new FileOutputStream("f:\\utf.txt"),"utf-8");
osw1.write("你好");
osw1.close();
//以对应的编码格式读取
InputStreamReader isr=new InputStreamReader(new FileInputStream("f:\\utf.txt"),"utf-8");
char[]buf=new char[1024];
int len=0;
while ((len=isr.read(buf))!=-1) {
System.out.println(new String(buf,0,len));
}
这样就会不会出现乱码问题了。
计算机只能识别二进制数据,为了方便应用计算机,让它可以识别各个国家的文字,就将各个国家的
文字用数字来表示,并一一对应,形成一张表,这就是编码表。
基本编码表介绍
ASCII:美国标准信息交换码:用一个字节的7位表示
ISO8859—1:拉丁码表。欧洲码表:用一个字节的8位表示
GB2312:中国的中文编码表
GBK:中国的中文码表升级版
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,java语言使用的就是unicode,一个字符俩字节
utf-8:最多用三个字节来表示一个字符
编码的转换
编码:字符串变成字节数组 String--->byte[]即str.getBytes(charsetName);
解码:字节数组变成字符串 byte[]--->String即new String(byte[],charsetName)
String s="你好";
byte[]b=s.getBytes();
System.out.println(Arrays.toString(b));
//打印结果为[-28, -67, -96, -27, -91, -67]说明平台默认编码为utf-8
String s1="你好";
byte[]b1=s1.getBytes("gbk");
System.out.println(Arrays.toString(b1));
//打印结果为[-60, -29, -70, -61]因为GBK是用两个字节表示的字符
由上面的例子说明因为编码表的不同所以保存的数据是不一样的,所以对应的解码表不一致的话就会出现乱码问题。
以下面的例子说明
UTF-8 utf.txt 显示(乱码)
你好 你 -28 -67 -96 写入文本 -28 -67 -96 读取(GBK) -28 -67 浣
好 -27 -91 -67 -27 -91 -67 - 96 -27
犲
-91 -67 ソ
出现这种情况就需要转码
String
m="你好";
byte[]p=m.getBytes("utf-8");
String m1=new String(p,"iso8859-1");
System.out.println("m1=="+m1);
//对出现的乱码重新编码解码
byte[]p1=m1.getBytes("iso8859-1");
String m2=new String(p1,"utf-8");
System.out.println(m2);
打印的结果就是 你好
这中情况主要出现在客户端和服务器这种情况,由于tomcat服务器默认编码是iso8859-1.所以客户端使用GBK或
UTF-8这种情况就需要在服务器重新编码解码返回到客户端。有人会说问什么不把服务器的编码编程GBK或者UTF-8
这样就不用编码在解码这一过
4000
程了,实际上一个服务器可能会有多个工程项目,一个用GBK,一个用UTF-8最后还会乱码,所以上述代码就是一个通用的方式。
流转换编码
对上面的理解透彻落后就可以对流进行操作了
这时候要使用OutputStreamWriter 和InputStreamReader
//以特定编码格式写入
OutputStreamWriter osw1=new OutputStreamWriter(new FileOutputStream("f:\\utf.txt"),"utf-8");
osw1.write("你好");
osw1.close();
//以对应的编码格式读取
InputStreamReader isr=new InputStreamReader(new FileInputStream("f:\\utf.txt"),"utf-8");
char[]buf=new char[1024];
int len=0;
while ((len=isr.read(buf))!=-1) {
System.out.println(new String(buf,0,len));
}
这样就会不会出现乱码问题了。
相关文章推荐
- Java实现图片与Base64编码互转
- Java 程序员的编码守则
- Java中的编码处理
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- 【JAVA编码专题】UNICODE,GBK,UTF-8区别
- java中的编码方式
- 【JavaWeb-6】HttpServletResponse的字符字节输出流、编码、文件下载、Captcha图片与HttpServletRequest获取request数据表单非表单数据、重定向与转发
- java怎么判断一个文本是什么编码格式以及运行在doc下,javadoc注释文档
- java编码问题
- jsp中中文出现乱码的原因及解决方案(Java中Unicode、编码的理解)
- java安全技术-Base64编码与解码
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- encodeURIComponent编码后java后台的解码
- 随笔-js汉字编码和解码,java汉字编码与解码
- 如何使用Java代码获取文件、文件流或字符串的编码方式
- java 编码
- Eclipse中Java开发中版权声明及编码风格的注释
- Java反转字符串和相关字符编码问题
- 【java】java base64编码与解码
- atitit.Atitit.检测文本文件的编码 java 与php版 。Net