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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:36:02