Как преобразовать неподдерживаемый символ в HTML-объект в Java - PullRequest
0 голосов
/ 19 ноября 2009

Некоторые символы не поддерживаются определенной кодировкой, поэтому тест ниже не пройден. Я хотел бы использовать HTML-сущность для кодирования ТОЛЬКО тех, кто не поддерживает символ. Как, в Java?

public void testWriter() throws IOException{
    String c = "\u00A9";
    String encoding = "gb2312";
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    Writer writer  = new BufferedWriter(new OutputStreamWriter(outStream, encoding));
    writer.write(c);
    writer.close();
    String result = new String(outStream.toByteArray(), encoding);
    assertEquals(c, result);
}

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Я не уверен, что понимаю вопрос, но что-то вроде этого может помочь:

import java.nio.charset.CharsetEncoder;

...

  StringBuilder buf = new StringBuilder(c.length());
  CharsetEncoder enc = Charset.forName("gb2312");
  for (int idx = 0; idx < c.length(); ++idx) {
    char ch = c.charAt(idx);
    if (enc.canEncode(ch))
      buf.append(ch);
    else {
      buf.append("&#");
      buf.append((int) ch);
      buf.append(';');
    }
  }
  String result = buf.toString();

Этот код не является надежным, потому что он не обрабатывает символы за пределами базовой многоязычной плоскости. Но перебирая кодовые точки в String и используя canEncode(CharSequence) метод CharsetEncoder, вы сможете обрабатывать любой символ.

0 голосов
/ 19 ноября 2009

Просто используйте utf-8, и таким образом нет смысла использовать сущности. Если есть аргумент, что некоторые клиенты нуждаются в gb2312, потому что они не понимают Unicode, тогда сущности также мало используются, потому что числовые сущности представляют кодовые точки Unicode.

0 голосов
/ 19 ноября 2009

Попробуйте использовать StringEscapeUtils от Apache Commons.

...