Как решить эту проблему кодирования в Java - PullRequest
2 голосов
/ 21 августа 2011

У меня проблема с кодировкой в ​​Java, одна строка, которую мне действительно нужно обработать, - это ответ от запуска команды systeminfo в командной строке Windows, и мне нужно представить результат в HTML-документе.Проблема в том, что если я запускаю свое приложение на французской операционной системе, искаженные символы отображаются в html, независимо от того, как я пытался преобразовать настройки кодирования.

Из журнала я вижу, что кодировка системы«Cp1252», фрагмент кода выглядит следующим образом:

String systemEncoding = System.getProperty("sun.jnu.encoding");
log.info("sun.jnu.encoding="+systemEncoding);

В классе HTML Builder я сделал что-то вроде этого:

for(String line : lines){
    line = new String(line.getBytes("Cp1252"), "UTF8");
    osReport.append(line + "<br>");
}

К сожалению, я все еще вижу эти искаженные »вопросительные знаки"все вокруг, которые должны быть некоторыми французскими символами .. Заголовок html выглядит следующим образом: btw

<HEAD>
<META content="text/html; charset=UTF-8" http-equiv=Content-Type>
</HEAD>

Как получить строку ответа, посмотрите следующий фрагмент кода, пожалуйста ..

try{
    String systemEncoding = System.getProperty("sun.jnu.encoding");
    log.info("sun.jnu.encoding="+systemEncoding);
    InputStreamReader isr;
    if (StringUtil.isEmpty(systemEncoding)) {
        isr = new InputStreamReader(is);
    } else {
        isr = new InputStreamReader(is, systemEncoding);
    }
    BufferedReader br = new BufferedReader(isr);
    String line=null;
    while ((line = br.readLine()) != null) {
        res.append(line);
        res.append(LINE_SEP);
    }   
 } catch (IOException ioe) {
    log.error("IOException occurred while printing the response",ioe);
 }

Любая помощь?Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 21 августа 2011

Я предполагаю, что вы вызываете команду через тип Process. Я ожидаю, что systeminfo.exe запишет вывод, используя кодировку ANSI по умолчанию (windows-1252 во французской системе.)

Это означает, что вы можете использовать кодировку по умолчанию для чтения ввода (который используется конструктором InputStreamReader(InputStream)). Это перекодирует ввод из кодировки по умолчанию UTF-16. Этот код использует тип Scanner с системной кодировкой по умолчанию:

Process process = new ProcessBuilder(command).redirectErrorStream(true)
    .start();
InputStream in = process.getInputStream();
try {
  Scanner scanner = new Scanner(in);
  while (scanner.hasNextLine()) {
    lines.add(scanner.nextLine());
  }
  if (process.exitValue() != 0 || scanner.ioException() != null) {
    // throw exceptions
  }
} finally {
  in.close();
}

Строки Java всегда UTF-16, поэтому код, подобный этому, является просто ошибкой транскодирования:

new String(line.getBytes("Cp1252"), "UTF8");

Убедитесь, что вы правильно кодируете свой HTML-файл.

Charset utf8 = Charset.forName("UTF-8");
OutputStream out = new FileOutputStream(file);
Closeable stream = out;
try {
  Writer writer = new OutputStreamWriter(out, utf8);
  stream = writer;
  // write to writer here
} finally {
  stream.close();
}

Я бы не пытался читать или напрямую изменять системные свойства, такие как sun.jnu.encoding или file.encoding - это детали реализации JVM, и их прямое использование или конфигурация не поддерживаются.

Если вы используете System.out для проверки символов, убедитесь, что устройство , потребляющее вывод , декодирует свой ввод как windows-1252. См. здесь для получения дополнительной информации о кодировке.

0 голосов
/ 21 августа 2011

Без определения используемой кодировки символов вы не можете отобразить эти французские символы в html, используя кодовую точку простого символа. Другими словами, это не работает:

<html>
<body>
accent égu et ce çedille :D
</body>
</html>

В результате:

Акцент à © gu et ce çedille: D

Итак, вы должны определить кодировку в мета-заголовках ИЛИ заменить все французские символы их экранирующим эквивалентом. Полный список здесь.


И о хитрости с системной кодировкой символов: я не думаю, что то, что говорит sun.jnu.encoding, является той же кодировкой, которую systeminfo.exe использует для вывода.

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