2016-01-08 35 views
1

我希望能夠德國元音字符音譯德國變音使用ICU4J到他們DIN 5007-2替代

Ü ü ö ä Ä Ö 

音譯爲他們DIN 5007-2替代

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

像在這種情況下:

https://german.stackexchange.com/questions/4992/conversion-table-for-diacritics-e-g-%C3%BC-%E2%86%92-ue

最相關的使用情況下,我發現: https://github.com/elastic/elasticsearch-analysis-icu/blob/master/src/test/java/org/elasticsearch/index/analysis/SimpleIcuCollationTokenFilterTests.java

其中上線208他們做

String DIN5007_2_tailorings = 
      "& ae , a\u0308 & AE , A\u0308"+ 
      "& oe , o\u0308 & OE , O\u0308"+ 
      "& ue , u\u0308 & UE , u\u0308"; 

我想,以避免產生複雜的Java代碼,例如定義自定義tailorings和所有的需要。我想讓代碼儘可能簡單,因爲我必須在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()方法。這裏 的問題是什麼是會導致音譯變音到他們DIN 5007-2當量.getInstance()方法的ID字符串?

+0

對不起,你在試圖避免與來自管線208的東西? –

+1

我想避免創建自定義剪裁。 –

回答

1

您可以創建一個有規則的字符串,如:

ä → 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; 

給予以下

A○U A O u那樣在OT UT SS→AE OE UE AE OE UE AET OET UET SS

+0

規則運作良好。不知道如何將它們與'Transliterator latinAscii = Transliterator.getInstance( 「拉丁-ASCII」)相結合;'? –