You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Unicode字符转换为ISO-8859-15/Latin9兼容字符?

问题描述

我有一个包含转义Unicode字符的UTF-8格式JSON,示例如下:

{
    "description": "This is an ellipsis: \u2026"
}

该JSON通过Jackson解析后,需要将字符串转换为适配ISO-8859-15/Latin9平台的字节:

final byte[] d = description.getBytes(Charset.forName("ISO-8859-15"));

但省略号(…)这类字符不在ISO-8859-15/Latin9字符集中。我需要将不支持的Unicode字符转换为该字符集支持的合理字符或组合,例如:

  • \u2026(省略号…)→ ...
  • \u2013(短破折号–)→ -
  • \u2018(左单引号‘)→ '
  • \u2019(右单引号’)→ '
  • \u201c(左双引号“)→ "
  • \u201d(右双引号”)→ "
  • \u2022(项目符号•)→ .

理想情况无需自行枚举所有输入输出映射,请问是否有JDK类或第三方库可实现此转换?

解决方案

1. ICU4J(推荐)

ICU4J的Transliterator类内置了成熟的Unicode字符转换规则,能自动将特殊Unicode字符映射为ISO-8859-15兼容的普通字符,无需手动维护庞大的替换表。

步骤:

  1. 引入依赖(Maven):
<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>74.2</version>
</dependency>
  1. 实现转换:
import com.ibm.icu.text.Transliterator;

public class UnicodeToLatinConverter {
    // 定义转换规则:任意Unicode转拉丁字符→拉丁字符转ASCII→保留基础标点
    private static final Transliterator TRANSLITERATOR = Transliterator.getInstance(
        "Any-Latin; Latin-ASCII; [\\p{Punct}]",
        Transliterator.FORWARD
    );

    public static String convert(String input) {
        return TRANSLITERATOR.transliterate(input);
    }
}
  1. 使用示例:
String parsedDescription = "This is an ellipsis: …";
String compatibleStr = UnicodeToLatinConverter.convert(parsedDescription);
// 输出:"This is an ellipsis: ..."
byte[] latinBytes = compatibleStr.getBytes(Charset.forName("ISO-8859-15"));

这个规则会自动处理智能引号、省略号、特殊破折号等字符的合理替换,完全覆盖你给出的示例场景。

2. Apache Commons Text(替代方案)

Apache Commons Text提供了字符处理工具,但需要结合自定义规则才能实现类似效果,灵活性不如ICU4J。例如可以使用StringEscapeUtils配合Replacements工具,但需要手动补充部分规则,适合需求简单的场景。

3. JDK自带工具(不推荐)

JDK自带的CharsetEncoder仅支持将不兼容字符替换为固定符号(默认是?),无法实现自定义的合理映射;Normalizer仅能做字符归一化(如分解组合字符),不能处理特殊标点到普通字符的转换,无法满足需求。

内容的提问来源于stack exchange,提问作者Friet Stoofvlees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:26:04