如何将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兼容的普通字符,无需手动维护庞大的替换表。
步骤:
- 引入依赖(Maven):
<dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>74.2</version> </dependency>
- 实现转换:
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); } }
- 使用示例:
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
相关产品推荐
相关产品推荐

