为了加块首页的显示速度,我从网上copy了一个将jsp转换为html的servlet程序。但是在使用的时候,index.jsp变成index.htm时有中文的地方就是乱码的,如何解决乱码问题??
已知:index.jsp第一行已经有<%@ page contentType="text/html; charset=GBK"%>
copy来的sevlet程序:
public class ToHtml extends HttpServlet
{    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    String url="";
    String name="";
    
        ServletContext sc = getServletContext();
        
        String file_name=request.getParameter("file_name");//你要访问的jsp文件,如index.html
  //则你访问这个servlet时加参数.如http://localhost/toHtml?file_name=index        url = "/"+file_name+".jsp";//这是你要生成HTML的jsp文件,如
                                   //http://localhost/index.html的执行结果.        name="d:/test/"+file_name+".htm";//这是生成的html文件名,如index.htm."
                
        RequestDispatcher rd = sc.getRequestDispatcher(url);
        
        final ByteArrayOutputStream os = new ByteArrayOutputStream();
        
        final ServletOutputStream stream = new ServletOutputStream()
        {
            public void write(byte[] data, int offset, int length)
            {
                os.write(data, offset, length);
            }            public void write(int b) throws IOException
            {
                os.write(b);
            }
        };
        
        final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
        
        HttpServletResponse rep = new HttpServletResponseWrapper(response)
        {
            public ServletOutputStream getOutputStream()
            {
                return stream;
            }
            
            public PrintWriter getWriter()
            {
                return pw;
            }
        };
        rd.include(request, rep);
        pw.flush(); 
       //我怀疑乱码出现再这里
        FileOutputStream fos = new FileOutputStream(name); //把jsp输出的内容写到xxx.htm
        os.writeTo(fos);
        fos.close();
        response.setContentType("text/html;charset=GBK"); 
        PrintWriter out=response.getWriter();
        out.print("<p align=center><font size=3 color=red>首页已经成功生成!Andrew</font></p>");
    }
}

解决方案 »

  1.   

    文件中有中文的话就好是用字符流进行操作! 也就是高级流!去baidu一下!加一句代码就可以了!
      

  2.   

    楼上的,我对javaio不熟,能说详细点吗?
      

  3.   

    换成这样看看
    response.setContentType("text/html");
    response.setCharacterEncoding("GBK");
    PrintWriter out = response.getWriter();
      

  4.   

    楼上的,servlet里面已经有你说的了,就在倒数第三行。
      

  5.   

    首先你要确定是否写入的文件内容是否乱码,在写入文件是可以进行转码,<%@ page contentType="text/html; charset=GBK"%>这句话只是告诉浏览器以什么字符集解析html文件,如果你的html本身乱码它是没有办法的。查看一下response的api,有转码和指定字符集方法。response.setContentType("text/html"); 
    response.setCharacterEncoding("GBK"); 
    PrintWriter out = response.getWriter(); 
      

  6.   

    楼上的,servlet里面已经有你说的了,就在倒数第三行。
      

  7.   

    至今为止尚未有人提出解决方案啊,
    这个servlet程序是baidu出来的,很多人的博客都在贴这个但是我怀疑他们只是贴出来,没有实际用到,否则他们也会出来问的,当然,或许还是我水平的原因吧 
      

  8.   

    io在输入输出的时候,如果没有转码动作,输入是什么字符,输出就是什么字符。
    servlet也是同样的。如果能保证通过浏览器在jsp上看到的不是乱码,将其转为html的时候也不会出现乱码,因为编码的字节是不会变化的。对于lz的问题,先确定jsp头上提供给浏览器解析的字符集是否同实际jsp文件中中文显示的字符集一致。(有些编辑器是会自动匹配字符集的,就算你的中文不是GBK,是如utf-8,你的jsp头的描述为GBK,同样在编辑器中是不会出现乱码的。调整编辑器的编辑字符集为GBK,看看中文)保证不乱码需要注意:
    1、输入的字节编码是什么编码,输出的字节编码就是什么编码。
    2、jsp,html头上的编码集描述,是告诉浏览器通过什么编码来解析你的文件,同你的实际编码是两回事。
    3、如果输入改变了字节编码,在输出的时候一定要恢复。
      

  9.   

    是不是  你也要 考虑到 请求时的编码问题啊(或者是) !!
    加<% request.setCharacterEncoding("GBK");%>
    试试吧 今天刚学的
    嘿嘿  献丑了 
      

  10.   

    字节流不能直接操作UNICODE字符,建议用字符流读写文件
      

  11.   

    如1楼所说用高级流
    FileReader 
    FileWriter 例子:
        File fin =new File("fin.txt");                               //创建输入文件对象             File fout=new File("fout.txt");                           //创建文件输出对象           FileReader in = new FileReader(fin);               //创建文件字符流 读 对象,传递文件对象           FileWriter out = new FileWriter(fout);                //创建文件字符流 写 对象,传递文件对象             int c;             while((c=in.read())!=-1)               //读                {                         out.writer();                            //写                }          in.close();         out.close();       }} FileWriter out = new FileWriter(fout);                FileWriter()中的对象可以是 文件对象,也可以是文件URL
      

  12.   

    PrintStream print=new PrintStream(name);
    print.print(os);
    试试这个,
      

  13.   

    现在,开发中暂时不要求采用jsp转换为html了,所以,这件事情暂时告一个段落了
    感谢各位的现眼献策,谢谢!