在Firefox中获取垃圾字符在IE中正常工作

时间:2010-12-13 06:12:42

标签: firefox character-encoding

我使用下面的代码来使用printwriter在浏览器上获取输出。

String b= new String(a.getBytes("UTF-16LE"),"UTF-8"); 

输出对IE很好,但在Firefox中我得到了

  

< h 3 > C o m m e n t s < / h 3 > < t a b l e > < t r b g c o l o r = ' # E 7 E 7 E F ' > < t d > P o s t e d O n : 1 2 - 1 3 - 2 0 1 0 1 0 : 3 8 : 2 4 , B y :

这是面临的问题的示例输出。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "w3.org/TR/html4/loose.dtd">;
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" 
      CONTENT="no-cache">
  </head> 
  <body>
    <form name="form" method="post">
    <% 
    String theString = null; 
    PrintWriter pw = null; 
    String cmntbox = ""; 
    ServletOutputStream outStream = null; 
    try { 
      Connection con = null; 
      PreparedStatement pstmt = null; 
      ResultSet rs = null; 
      String sql = null; 
      InputStream sImage; 
      con = DBConnection.getConnection();
      sql = SELECT statement 
      pstmt = con.prepareStatement(sql); 
      rs = pstmt.executeQuery(); 
      while (rs.next()) { 
        byte bytearray[] = new byte[1048576]; 
        String newLine = System.getProperty("line.separator"); 
        sImage = rs.getBinaryStream(1); 
        StringWriter writer = new StringWriter(); 
        request.setCharacterEncoding("UTF-8"); 
        response.setContentType("text/html;charset=UTF-8"); 
        pw =response.getWriter(); 
        IOUtils.copy(sImage, writer); 
        theString = writer.toString(); 
        pw.write(theString); 
        pw.flush();
        cmntbox = Utility.getCommentPage(id,prcs_area); 
        String comment = new String(cmntbox.getBytes("UTF-16LE"),"UTF-8"); 
        pw.write(comment); 
        pw.flush(); 
        pw.close(); 
      }

2 个答案:

答案 0 :(得分:2)

String comment = new String(cmntbox.getBytes("UTF-16LE"),"UTF-8");

几乎肯定是错的。您从Utility.getCommentPage获得的字符串应包含您想要的字符。使用一种编码将这些字符转换为字节,然后使用另一种编码将字节转换回字符,将导致您看到的内容。

特别是,典型HTML的UTF-16编码中的每个其他字节都为零。零是一个完全有效的字节,可编码为UTF-8中的单个NUL字符。 IE可能会想,“显然这是错误的,所以我会尽力提供帮助并做我认为你的意思”;而Firefox只是显示你想要的内容。

如果您跳过转换并执行

会发生什么
pw.write(cmntbox);

直接?在您执行response.setContentType之前,您已使用charset=执行了response.getWriter。当你然后write一个字符串时,它应该为你做字符编码。

答案 1 :(得分:1)

我认为您的问题是firefox不知道您正在尝试显示unicode。您是否尝试过输入正确的doctype和内容类型?

内容类型应为&lt; meta http-equiv =“Content-Type”content =“text / html; charset = utf-8”&gt;

类似问题 - http://www.webdeveloper.com/forum/showpost.php?s=7981302b7ad7c59bb2b79ff03b462e45&p=680562&postcount=6