【问题标题】:UTF-8 -- ISO 8859-1 mapping toolUTF-8 -- ISO 8859-1 映射工具
【发布时间】:2013-05-10 05:20:43
【问题描述】:

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

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

【问题讨论】:

  • @Hasan 抱歉,在重新阅读您的问题后,我错误地投票结束。
  • 这个问题不是骗人的!建议的解决方案仅适用于 US-ASCII,但 iso8859-1 还包含几个字母,如 ÄÖÜ 应与 İ 区分开来(包含在 utf-8 中,但不在 iso8859-1 中)

标签: java character-encoding


【解决方案1】:

对于具体的例子,你可以:

  • 使用兼容形式Unicode normalization分解字母和变音符号
  • 指示encoder 删除不受支持的字符(变音符号)

例子:

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,以实现音译等功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多