【问题标题】:Rename ä, ö, ü to ae, oe, ue将ä、ö、ü重命名为ae、oe、ue
【发布时间】:2015-05-10 17:13:27
【问题描述】:

我们希望重命名字符串,以便将“奇怪”字符(如德语变音符号)转换为其官方的非变音符号表示。在 Java 中,是否有一些函数可以转换此类字符(AKA 处理映射),不仅适用于德语变音符号,还适用于法语、捷克语或斯堪的纳维亚语字符?原因是创建一个可以重命名文件/目录的函数,Subversion 在不同平台上可以毫无问题地处理。

This question 类似,但没有有用的答案。

【问题讨论】:

  • 或者是这个的副本:stackoverflow.com/questions/1234510/… 也可以。
  • ä不对应ae,ö不对应oe,ü不对应ue。这些是不同的字符。但是,您可以通过创建具有相应字符的映射,检查该字符是否在该映射中,如果是则替换它,将它们转换为常规(例如 ä -> a)。
  • 斯堪的纳维亚字符 å,ä,ö,ø,æ 实际上不是变音符号,它们是单独的字符。所以没有这样的官方翻译。
  • 这个操作的术语是音译。

标签: java diacritics


【解决方案1】:

使用重症监护室Transliterator。它是执行这些类型的音译的通用类。您可能需要提供自己的地图。

【讨论】:

【解决方案2】:

您可以使用 Unicode 块属性 \p{InCombiningDiacriticalMarks} 从字符串中删除(大多数)变音符号:

public String normalize(String input) {
  String output = Normalizer.normalize(input, Normalizer.Form.NFD); 
  Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");

  return pattern.matcher(output).replaceAll("");
}

不过,这不会以您想要的方式替换德语变音符号。它将ö 变成oä 变成a 等等。但也许这对你来说也没关系。

【讨论】:

  • 去掉变音符号和音译不一样。
【解决方案3】:

答案是Any-Latin; De-ASCII; Latin-ASCII;

使用Transliterator 的PHP 特定答案(抱歉没有提供Java 代码)

$val = 'BEGIN..Ä..Ö..Ü..ä..ö..ü..ẞ..ß..END';
echo Transliterator::create('Any-Latin; De-ASCII; Latin-ASCII;')->transliterate($val);
// output
//    BEGIN..AE..OE..UE..ae..oe..ue..SS..ss..END

正常的 ASCII 规则是Any-Latin; Latin-ASCII; (BEGIN..A..O..U..a..o..u..SS..ss..END)

规则应适用于任何支持ICU = Unicode 国际组件的语言。

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2015-05-04
    相关资源
    最近更新 更多