0

某些字符集不支持某些字符,因此以下测试失败。我想使用 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);
}
4

3 回答 3

4

我不确定我理解这个问题,但这样的事情可能会有所帮助:

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,您应该能够处理任何字符。

于 2009-11-19T04:37:44.133 回答
0

只需使用 utf-8,这样就没有理由使用实体。如果有人认为某些客户端因为不理解 Unicode 而需要 gb2312,那么实体也没有多大用处,因为数字实体代表 Unicode 代码点。

于 2009-11-19T07:20:11.770 回答
0

尝试使用来自 apache commons 的StringEscapeUtils 。

于 2009-11-19T03:54:43.197 回答