A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孙百鑫 于 2013-6-27 07:03 编辑

  1. <P>class Demo
  2. {
  3.       public static void main(String[] args) throws IOException
  4.      {
  5.             //先通过字符串对 "你好" 进行编码和解码操作
  6.            String s1 = "你好";      //定义一个字符串,用以编码和解码
  7.            byte[] buf = s1.getBytes("GBK");       // 以GBK编码表将s1字符串编码成字节数组
  8.            System.out.println("字符串编码结果:"+Arrays.toString(buf));     // 以字符串形式打印字节数组中的每个元素

  9.            String s2 = new String(buf,"UTF-8");         // 通过UTF-8编码集,将字节数组解码成字符串
  10.            System.out.println("字符串解码结果:"+s2);       //打印解码结果。


  11.            //再来看看通过写入和读取流对 "你好" 进行编码和解码操作
  12.          OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("111.txt"),"GBK");     //定义一个转换流,以便通过该流,将"你好"写入到文件里面,写入的编码格式是GBK
  13.          osw.write("你好");      //将 "你好" 写入到 111.txt文件里面
  14.          osw.flush( );      //刷新流

  15.          InputStreamReader isr = new InputStreamReader(new FileInputStream("111.txt"),"UTF-8");     //定义一个转换流,通过UTF-8编码表来读取上面写入的字符数据
  16.          char[] arr = new char[1024];     //定义数组,用于存储读取到的字符数据
  17.          int len = isr.read(arr);
  18.          String str = new String(arr,0,len);      // 将读取到数组中的数据转成字符串形式
  19.          System.out.println("读取流解码结果:"+str);     // 打印转换后的结果
  20.        </P>
  21. <P>         osw.close();
  22.          isr.close();
  23.         }
  24. }</P>
复制代码
程序运行后的结果如下:


评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

10 个回复

倒序浏览
问题描述怎么都没显示出来?
回复 使用道具 举报
用UTF-8编码去解码GBK的 "你好",解出来的结果不是应该只有两个字符么,怎么现在解码出来三个"???"
回复 使用道具 举报
老毕视频讲的比较清楚。GBK和UTF-8都支持中文,但是两个字符编码不同。GBK是两个字节一个汉字,UTF-8三字节一个汉字,你好用UTF-8去编码需要使用六个字节,然后用这个六个字节用GBK去解码,所以会出现三个字符,但是很悲剧的是,GBK找不到起对应的编码,默认用“?”代替,所以就出现了三个连续的问号。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
刘胜寒 发表于 2013-6-20 14:47
老毕视频讲的比较清楚。GBK和UTF-8都支持中文,但是两个字符编码不同。GBK是两个字节一个汉字,UTF-8三字节 ...

寒哥,我明白你的意思,可是现在我是用GBK编码,用UTF-8解码,而非你说的用UTF-8去编码,用GBK去解码,不知道这样描述寒哥明白没?
回复 使用道具 举报
我用InputStreamReader的另一种读取方式试了试,结果是3个问号!你这种不知道是怎么回事.
         int b;
         while((b =isr.read())!=-1){
                 System.out.print((char)b);
         }
回复 使用道具 举报
UTF-8一下读3个字节,GBK读2个。
回复 使用道具 举报
黎志文 发表于 2013-6-20 15:45
寒哥,我明白你的意思,可是现在我是用GBK编码,用UTF-8解码,而非你说的用UTF-8去编码,用GBK去解码,不 ...

没有具体看你写的代码。但我看了结果我猜应该是和毕老师说的utf-8转到IOS8895-1转回utf-8和 gbk转到utf-8转到gbk的区别有关。毕老师说因为gbk和utf-8中都有中文导致的。
回复 使用道具 举报
虽然GBK和UTF-8都支持中文,但是两个字符编码不同也就是对应的字符不同所以就乱码了
你这里只要统一编码格式就没问题了
我试了下 没什么问题  你看看代码
  1. package com.heima.exercise;

  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.util.Arrays;


  8. class Demo
  9. {
  10.       public static void main(String[] args) throws IOException
  11.      {
  12.             //先通过字符串对 "你好" 进行编码和解码操作
  13.            String s1 = "你好";      //定义一个字符串,用以编码和解码
  14.            byte[] buf = s1.getBytes("GBK");       // 以GBK编码表将s1字符串编码成字节数组
  15.            System.out.println("字符串编码结果:"+Arrays.toString(buf));     

  16.            String s2 = new String(buf,"GBK");        
  17.            System.out.println("字符串解码结果:"+s2);      


  18.            //再来看看通过写入和读取流对 "你好" 进行编码和解码操作
  19.          OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("111.txt"),"GBK");     //定义一个转换流,以便通过该流,将"你好"写入到文件里面,写入的编码格式是GBK
  20.          osw.write("你好");      //将 "你好" 写入到 111.txt文件里面
  21.          osw.flush( );      //刷新流

  22.          InputStreamReader isr = new InputStreamReader(new FileInputStream("111.txt"),"GBK");     //定义一个转换流,通过UTF-8编码表来读取上面写入的字符数据
  23.          char[] arr = new char[1024];     //定义数组,用于存储读取到的字符数据
  24.          int len = isr.read(arr);
  25.          String str = new String(arr,0,len);      // 将读取到数组中的数据转成字符串形式
  26.          System.out.println("读取流解码结果:"+str);     // 打印转换后的结果
  27.      
  28.         osw.close();
  29.          isr.close();
  30.         }
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黎志文 发表于 2013-6-20 15:45
寒哥,我明白你的意思,可是现在我是用GBK编码,用UTF-8解码,而非你说的用UTF-8去编码,用GBK去解码,不 ...

看错了。。。不好意思。。
回复 使用道具 举报
楼主您好。我已将您的帖子改成已解决。如果帖子发布长时间没加分。及时联系我。以免漏分的情况发生{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马