3

当我将带有在 8859-1 中未知的字符的 UTF-8 字符串转换为 8859-1 时,我会在这里和那里得到问号。当然,他还能做什么!

是否有一个java工具可以将像“İKEA”这样的字符串映射到“IKEA”并避免?充分利用它?

4

1 回答 1

1

对于具体示例,您可以:

例子:

ByteArrayOutputStream out = new ByteArrayOutputStream();
// create encoder
CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder();
encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
// write data
String ikea = "\u0130KEA";
String decomposed = Normalizer.normalize(ikea, Form.NFKD);
CharBuffer cbuf = CharBuffer.wrap(decomposed);
ByteBuffer bbuf = encoder.encode(cbuf);
out.write(bbuf.array());
// verify
String decoded = new String(out.toByteArray(), StandardCharsets.ISO_8859_1);
System.out.println(decoded);

您仍在从定义 109,384 个值(Unicode 6)的字符集转码为支持 256 的字符集,因此总会有限制。

还可以考虑使用更复杂的转换 API,例如ICU,以实现音译等功能。

于 2013-05-16T15:24:32.497 回答