получение ненужных символов в Firefox, где работает нормально в IE - PullRequest
0 голосов
/ 13 декабря 2010

Я использовал приведенный ниже фрагмент кода, чтобы получить вывод в браузере, используя 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 ]

2 голосов
/ 13 декабря 2010
String comment = new String(cmntbox.getBytes("UTF-16LE"),"UTF-8");

почти наверняка неправильно. Строка, которую вы получаете из Utility.getCommentPage, должна содержать символы, которые вы хотите. Преобразование этих символов в байты с использованием одной кодировки, а затем преобразование байтов обратно в символы с другой кодировкой приведет к тому, что вы видите.

В частности, каждый второй байт в кодировке UTF-16 для типичного HTML равен нулю. И ноль - это совершенно правильный байт, который кодируется в один символ NUL в UTF-8. IE может подумать: «Очевидно, что это неправильно, поэтому я постараюсь быть полезным и делать то, что, как я думаю, вы имели в виду»; в то время как Firefox просто показывает, что вы сказали, что хотели.

Что произойдет, если вы пропустите конвертацию и просто выполните

pw.write(cmntbox);

напрямую? Вы уже сделали response.setContentType с charset= до того, как сделали response.getWriter. Когда вы затем write String, он должен сделать кодировку символов для вас.

1 голос
/ 13 декабря 2010

Я думаю, что ваша проблема в том, что firefox не знает, что вы пытаетесь отобразить юникод. Вы пытались ввести правильный тип документа и тип контента?

Тип содержимого должен быть

Аналогичная проблема - http://www.webdeveloper.com/forum/showpost.php?s=7981302b7ad7c59bb2b79ff03b462e45&p=680562&postcount=6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...