Java中如何将拉丁特殊字母转换为对应的英文字母
Java 实现特殊拉丁字符(Œ/Æ/Ø/ß等)转英文字母方案
Normalizer 仅适用于处理带附加变音符号的字符(比如é→e、ñ→n这类),而Œ、Æ、Ø、ß属于独立的拉丁字母变体/连字,没有可拆分的附加符号位,所以常规的Normalizer处理流程无法覆盖这类字符,需要额外做映射匹配。
以下是两种可直接落地的实现方式:
方案1:纯JDK无第三方依赖实现
思路是优先做特殊字符自定义映射,再走Normalizer处理普通变音符号,灵活度最高:
import java.text.Normalizer; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; public class LatinConverter { // 特殊字符映射表,可根据业务需求自由扩展 private static final Map<Character, String> SPECIAL_LATIN_MAP = new HashMap<>(); private static final Pattern DIACRITIC_PATTERN = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); static { // 大写特殊字符映射 SPECIAL_LATIN_MAP.put('Œ', "OE"); SPECIAL_LATIN_MAP.put('Æ', "AE"); SPECIAL_LATIN_MAP.put('Ø', "O"); SPECIAL_LATIN_MAP.put('ẞ', "SS"); // 小写特殊字符映射 SPECIAL_LATIN_MAP.put('œ', "oe"); SPECIAL_LATIN_MAP.put('æ', "ae"); SPECIAL_LATIN_MAP.put('ø', "o"); SPECIAL_LATIN_MAP.put('ß', "ss"); } public static String convertToAsciiLatin(String input) { if (input == null || input.isEmpty()) { return input; } // 第一步:替换自定义映射的特殊字符 StringBuilder sb = new StringBuilder(); for (char c : input.toCharArray()) { String replacement = SPECIAL_LATIN_MAP.get(c); if (replacement != null) { sb.append(replacement); } else { sb.append(c); } } // 第二步:用Normalizer处理常规变音符号 String normalized = Normalizer.normalize(sb.toString(), Normalizer.Form.NFD); return DIACRITIC_PATTERN.matcher(normalized).replaceAll(""); } // 测试示例 public static void main(String[] args) { System.out.println(convertToAsciiLatin("Œuvre æble øl Straße")); // 输出结果:OEuvre aeble ol Strasse } }
方案2:基于Apache Commons Lang扩展
如果项目已经引入了commons-lang3依赖,可以直接扩展StringUtils.stripAccents的能力,无需自己重写常规变音符号的处理逻辑:
import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; public class LatinConverter { private static final Map<Character, String> SPECIAL_LATIN_MAP = new HashMap<>(); static { SPECIAL_LATIN_MAP.put('Œ', "OE"); SPECIAL_LATIN_MAP.put('Æ', "AE"); SPECIAL_LATIN_MAP.put('Ø', "O"); SPECIAL_LATIN_MAP.put('ß', "ss"); SPECIAL_LATIN_MAP.put('œ', "oe"); SPECIAL_LATIN_MAP.put('æ', "ae"); SPECIAL_LATIN_MAP.put('ø', "o"); } public static String convertToAsciiLatin(String input) { if (input == null || input.isEmpty()) { return input; } StringBuilder sb = new StringBuilder(); for (char c : input.toCharArray()) { String replacement = SPECIAL_LATIN_MAP.get(c); if (replacement != null) { sb.append(replacement); } else { sb.append(c); } } // 调用commons-lang封装好的方法处理常规变音 return StringUtils.stripAccents(sb.toString()); } }
注意事项
- 字符映射没有统一通用标准,比如德语ß在部分规范下也可映射为
sz,可根据实际业务场景调整映射表内容 - 如果需要覆盖全量特殊拉丁字符,可参考Unicode拉丁扩展字符集的编码表,按需补充映射规则即可
内容的提问来源于stack exchange,提问作者olep
相关产品推荐
相关产品推荐

