GBK转UTF-8的方法 JAVA

原创 2011年01月10日 19:48:00

最近在做一个能分析网站新闻的网络爬虫,对方要求中文的新闻信息用UTF-8存储。可是国内大部分新闻网站的网页源代码里的中文都是GB2312 的,所以必须转成UTF-8.在网上搜了很多方法,有人自己写的,有人用String newcontent=new String(content.getBytes("GBK"),"UTF-8");这种方法,可是试过之后,好好的汉字都变成了乱码。于是到搜了一下英 文网页,很快就找到了解决之道。缺点是不是直接在内存中进行转换,而是把以GBK编码存储的文件转换成以UTF-8编码存储的文件。不管怎么说,能解决我的问题就好。(GB2312是GBK的子集,解决了GBK就解决了GB2312,在我这个项目里,由于GB2312不能正常显示某些不常用字,所以我使用了GBK)

英文网址如下,有兴趣的朋友可以看一下:http://www.chinesecomputing.com/programming/java.html

我把代码贴过来。convert(String infile, String outfile, String from, String to)函数就是转换函数,其中infile是要转换的文件路径,outfile是转换后存储的文件路径,from是infile的字符集,对应我的项目就 是GBK, to是outfile的字符集,对应我的项目就是UTF-8.
注意infile和outfile不能为相同路径,否则最后转换出的文件会是空文件。

import java.io.*;
public class inputtest {
  public static void main(String[] args) {
    String outfile = null;

    try { convert(args[0], args[1], "GBK", "UTF8"); } // or "GB2312" or "BIG5"
    catch (Exception e) {
      System.out.print(e.getMessage());
      System.exit(1);
    }
  }

  public static void convert(String infile, String outfile, String from, String to)
       throws IOException, UnsupportedEncodingException
  {
    // set up byte streams
    InputStream in;
    if (infile != null) in = new FileInputStream(infile);
    else in = System.in;
    OutputStream out;
    if (outfile != null) out = new FileOutputStream(outfile);
    else out = System.out;

    // Use default encoding if no encoding is specified.
    if (from == null) from = System.getProperty("file.encoding");
    if (to == null) to = System.getProperty("file.encoding");

    // Set up character stream
    Reader r = new BufferedReader(new InputStreamReader(in, from));
    Writer w = new BufferedWriter(new OutputStreamWriter(out, to));

    // Copy characters from input to output.  The InputStreamReader
    // converts from the input encoding to Unicode,, and the OutputStreamWriter
    // converts from Unicode to the output encoding.  Characters that cannot be
    // represented in the output encoding are output as '?'
    char[] buffer = new char[4096];
    int len;
    while((len = r.read(buffer)) != -1)
      w.write(buffer, 0, len);
    r.close();
    w.flush();
    w.close();
  }

}


转换后可以用“秀丸”这个文字编辑工具查看转换前后文字的编码。

 

有时候中文网页难以搜到答案时,去一下英文网页,也许答案马上就出来了~因此,学好英文是必要的。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

牛顿插值法

插值法利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。具有唯一性,需要求解各阶差商。如果这特定函数是多项式,...

如何解决ajax跨域问题(转)

如何解决ajax跨域问题(转) 由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

程序员编程艺术:第三章、寻找最小的k个数

程序员编程艺术:第三章、寻找最小的k个数作者:July。时间:二零一一年四月二十八日。致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作组。微...

MySQL 之九奇坑

MySQL 之九奇坑 本文来自依云's Blog,转载请注明。 使用了一段时间的 MySQL,体验与使用 PostgreSQL 完全不一样。使用 PostgreSQL 时,「it ...

如何从零起步学习AI

数据科学家的成长之路与学习路线:如何入门ML/DL前言我从2012年一直以一个业余研究者的身份开始学习机器学习,参考了诸多资料写了SVM模型的学习笔记。在一直想继续写但每每时间错不开的反复纠结中,于1...

Java中的Infinity和NaN

1、i == i + 1 一个数字永远不会等于它自己加1?Java 强制要求使用IEEE 754 浮点数算术运算[IEEE 754],它可以让你用一个double 或float来表示无穷大。正如我们...

面试者与面试官的对弈

转载: 我是怎么招聘程序员的 http://blog.csdn.net/haoel/article/details/5032418 再谈“我是怎么招聘程序员的” http://blog.c...
  • ppden
  • ppden
  • 2011-09-12 23:54
  • 495

有用的性能数据,请记住它吧~~

转载自:http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/L1 cache reference 0.5 nsBra...
  • adcxf
  • adcxf
  • 2011-04-10 15:07
  • 1080

从B树、B+树、B*树谈到R 树

从B 树、B+ 树、B* 树谈到R 树 作者:July、weedge、Frankie。编程艺术室出品。说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由w...

程序员编程艺术:第二章、字符串是否包含问题

程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题作者:July,yansha。时间:二零一一年四月二十三日。致谢:老梦,nossiac,Hession,Oliver,luuillu,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)