使用icu4j将德语umlauts转写为它们的DIN 5007-2替代字符

3
我希望您能够翻译德语umlaut字符。
Ü ü ö ä Ä Ö

将它们转换为符合DIN 5007-2标准的替代方案

ä → ae
ö → oe
ü → ue
Ä → Ae
Ö → Oe
Ü → Ue
ß → ss (or SZ)

在这种情况下,最相关的用例是:https://github.com/elastic/elasticsearch-analysis-icu/blob/master/src/test/java/org/elasticsearch/index/analysis/SimpleIcuCollationTokenFilterTests.java。在该用例中,第208行进行了操作。此外,您可以参考https://german.stackexchange.com/questions/4992/conversion-table-for-diacritics-e-g-%C3%BC-%E2%86%92-ue。请注意保留HTML标签。
String DIN5007_2_tailorings =
            "& ae , a\u0308 & AE , A\u0308"+
            "& oe , o\u0308 & OE , O\u0308"+
            "& ue , u\u0308 & UE , u\u0308";

我希望避免编写复杂的Java代码,例如定义自定义定制和所需的所有内容。 我希望尽可能简化代码,因为我必须在ColdFusion应用程序中使用此代码。
我进行了一些实验。
var instance = Transliterator.getInstance("Latin-ASCII");

并且

var instance = Transliterator.getInstance("any-NFD; [:nonspacing mark:] any-remove; any-NFC");

他们和他们的变体都会导致以下结果:
 writeDump(instance.transliterate('Häuser Bäume Höfe Gärten daß Ü ü ö ä Ä Ö ß '));

 Hauser Baume Hofe Garten dass U u o a A O ss 

如果可能的话,我希望继续使用.getInstance()方法。 问题在于,.getInstance()方法的ID字符串是什么,可以将变音符号转换为它们的DIN 5007-2等效形式?

抱歉,你在第208行的代码中试图避免什么问题? - undefined
1
我希望避免创建定制的裁剪。 - undefined
3个回答

4

现在有一种简单的解决方案,可以使用“de-ASCII”进行更新:

Transliterator transliterator = Transliterator.getInstance("de-ASCII");
String umlautReplaced = transliterator.transliterate(txt);

2
您可以使用规则字符串创建一个,例如:
ä → ae;
ö → oe;
ü → ue;
Ä → Ae;
Ö → Oe;
Ü → Ue;
ß → ss;

您可以在以下网址中查看此内容: http://unicode.org/cldr/utility/transform.jsp?a=%C3%A4+%E2%86%92+ae%3B%0D%0A%C3%B6+%E2%86%92+oe%3B%0D%0A%C3%BC+%E2%86%92+ue%3B%0D%0A%C3%84+%E2%86%92+Ae%3B%0D%0A%C3%96+%E2%86%92+Oe%3B%0D%0A%C3%9C+%E2%86%92+Ue%3B%0D%0A%C3%9F+%E2%86%92+ss%3B&b=H%C3%A4user+B%C3%A4ume+H%C3%B6fe+G%C3%A4rten+da%C3%9F+%C3%9C+%C3%BC+%C3%B6+%C3%A4+%C3%84+%C3%96+%C3%9F+ 但是,您可能需要稍微更复杂的方法,因为您的规则将HÄUSER映射到HAeUSER。
规则允许上下文,因此您可以执行以下操作:
$beforeLower = [[:Mn:][:Me:]]* [:Lowercase:] ;

ä → ae;
ö → oe;
ü → ue;

Ä } $beforeLower → Ae;
Ö } $beforeLower → Oe;
Ü } $beforeLower → Ue;

Ä → AE;
Ö → OE;
Ü → UE;
ß → ss;

给出以下内容

ä ö ü Ä Ö Ü Ät Öt Üt ß → ae oe ue AE OE UE Aet Oet Uet ss


1
规则运行良好。有没有办法将它们与 Transliterator latinAscii = Transliterator.getInstance("Latin-ASCII"); 结合起来? - undefined

1
很遗憾,“de-ASCII”不能像“iconv”一样将“€”符号转换为“EUR”。要实现这一点,您需要从一组规则创建一个“Transliterator”实例。下面的代码示例显示如何创建这样的“de-ASCII”变体,其中将“€”转换为“EUR”。这些规则基于“de-ASCII”的规则,因为它们是通过Transliterator.getInstance("de-ASCII").toRules(true))返回的,再加上欧元符号的添加规则。请保留HTML标签。
        final var rules = """
                          [\\u00E4{a\\u0308}] > ae;
                          [\\u00F6{o\\u0308}] > oe;
                          [\\u00FC{u\\u0308}] > ue;
                          {[\\u00C4{A\\u0308}]}[:Lowercase:] > Ae;
                          {[\\u00D6{O\\u0308}]}[:Lowercase:] > Oe;
                          {[\\u00DC{U\\u0308}]}[:Lowercase:] > Ue;
                          [\\u00C4{A\\u0308}] > AE;
                          [\\u00D6{O\\u0308}] > OE;
                          [\\u00DC{U\\u0308}] > UE;
                          [\\u20AC] > EUR;
                          ::Any-ASCII;""";
        final var instance = Transliterator.createFromRules("de_EUR-ASCII", rules, Transliterator.FORWARD);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接