Чтение EUC-кодированного HTML с использованием Java в Windows - PullRequest
3 голосов
/ 16 января 2011

Я пытаюсь прочитать файл HTML, закодированный в EUC-KR, из URL. Когда я компилирую код внутри IDE, я получаю желаемый результат, но когда я собираю jar и пытаюсь запустить jar, прочитанные данные отображаются в виде вопросительных знаков («????» вместо корейских символов). Я предполагаю, что это связано с потерей кодировки.

Мета сайта говорит следующее:

 <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">

Вот мой код:

  String line;
  URL u = new URL("link to the site");
  InputStream in = u.openConnection().getInputStream();
  BufferedReader r = new BufferedReader(new InputStreamReader(in, "EUC-KR"));
  while ((line = r.readLine()) != null) {
    /*send the string to a text area*/--> This works fine now
    /*take the string and pass it thru ByteArrayInputStream*/ --> this is where I believe the encoding is lost.

    InputStream xin = new ByteArrayInputStream(thestring.getBytes("EUC-KR"));
    Reader reader = new InputStreamReader(xin);
    EditorKit kit = new HTMLEditorKit();
    HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
    kit.read(reader, doc, 0);
    HTMLDocument.Iterator it = doc.getIterator(HTML.Tag.STRONG);

    while (it.isValid()) {
      chaps.add(doc.getText(it.getStartOffset(), it.getEndOffset() - it.getStartOffset()).trim());
      //chaps is a arraylist<string>
      it.next();
    }

Буду признателен, если кто-нибудь поможет мне понять, как захватывать символы без потери кодировки при запуске приложения на любой платформе, независимо от кодировки системы по умолчанию.

Спасибо

PS: программа при запуске в формате jar отображает системную кодировку Cp1252 и UTF-8 при запуске внутри IDE.

1 Ответ

3 голосов
/ 16 января 2011
InputStream xin = new ByteArrayInputStream(thestring.getBytes("EUC-KR"));
Reader reader = new InputStreamReader(xin);

Это ошибка транскодирования. Вы кодируете строку как «EUC-KR» и декодируете ее, используя системную кодировку (что приводит к ненужному). Чтобы избежать этого, вам придется передать кодировку в InputStreamReader .

Однако было бы лучше избежать всего этого кодирования и декодирования и просто использовать StringReader .

...