2012-04-17 77 views
4

我有以下字符。將拉丁字符轉換爲Java中的普通文本

一個¢¥ŚŠŞŤŹŽŻąľśšşťźžżÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

我需要轉換爲

AcYSSSTZZZalssstzzzAAAAAAACEEEEIIIIDNOOOOOOUUUUYTSaaaaaaaceeeeiiiionoooooouuuuyty

我使用Java 1.4。

Normalizer.decompose(text,true,0).replaceAll( 「\ p {InCombiningDiacriticalMarks} +」,「」);只用符號替換字符。

類似¢ÆÐÞßæðøþ的字符沒有被轉換。

我該怎麼做,在JDK 1.4中進行轉換的有效方法是什麼?

請幫忙。

問候, 詩麗黛瑋·阿雅潘

+1

Y並不等於¥ - 考慮¥意味着「元」。你可能需要實現一個查找表,因爲@ stephen -c建議 – Deco 2012-04-17 09:37:35

+0

我需要幫助來形成查找表並從查找表中獲取等效字符。我可能不希望查找表包含¥,我可能想存儲unicode等價物並將其轉換爲Y. – 2012-04-17 09:40:26

+0

與@Deco同意,只是添加到主題中,我不認爲ß等價於S或者......至少在德語中它相當於SS,將「Strasse」替換爲「Strasse」而不是「Strasse」就是錯誤的。 – Fredrik 2012-04-17 09:43:59

回答

3

我如何能做到這一點,什麼是做轉換在JDK 1.4的有效途徑。

最有效的方法是使用實​​現爲數組或HashMap的查找表。但是,當然,你需要填充表格。

類似¢ÆÐÞßæðøþ的字符沒有被轉換。

那麼沒有那些字符真的是羅馬字母,不能被翻譯成羅馬字母......沒有采取過分的語義自由。例如:

  • ¢和¥是貨幣符號,
  • AE和E是連字在某些語言中代表兩個字母,而在另一些鮮明的一封信,
  • SS是一個德國表示雙S。
+0

查找表應該如何?我不想用特殊字符保存查找表,因爲有些編輯器不支持這些查詢,我可以在查找中放置等效的unicode字符,如果是,代碼應該如何?我必須從查找表中獲取unicode字符,以及如何將其轉換爲正常文本? – 2012-04-17 09:38:17

+0

我以爲'char []'會比HashMap更高效。 ;) – 2012-04-17 09:54:19

+0

@PeterLawrey - 它取決於輸入集的大小,以及您是在優化空間還是時間。 – 2012-04-17 11:06:08

2

我會做這樣的事情;

更新的Java 1.4中(除去仿製藥)

public class StringConverter { 

    char[] source = new char[]{'Ą', '¢', '¥', 'Ś'}; // all your chars here... 
    char[] target = new char[]{'A', 'c', 'Y', 'S'}; // all your chars here... 
    //Build a map 
    HashMap map; 

    public StringConverter() { 
     map = new HashMap(); 
     for (int i = 0; i < source.length; i++) { 
      map.put(new Character(source[i]), new Character(target[i])); 
     } 
    } 

    public String convert(String s) { 
     char[] chars = s.toCharArray(); 
     for (int i = 0; i < chars.length; i++) { 
      chars[i] = map.get(chars[i]); 
     } 
     return new String(chars); 
    } 

} 
+0

我正在使用JDK 1.4,我不想存儲特殊字符作爲默認CP1252編碼的eclipse支持。 – 2012-04-17 09:48:18

+3

Eclipse的默認編碼和Java版本之間的連接是什麼?您可以將Eclipse中的默認編碼更改爲UTF-8,並且它仍然可以工作。 – Sorin 2012-04-17 09:51:43

+0

謝謝。我已經提到了Java 1.4的HashMap map。 – 2012-04-17 09:54:07

6

退房的ICU project,尤其是ICU4J部分。 Transliterator類將解決您的問題。

下面是一個例子的Transliterator,其將任何腳本以拉丁字符,並刪除任何修飾和非ASCII字符:

Transliterator accentsConverter = Transliterator.getInstance("Any-Latin; NFD; [:M:] Remove; NFC; [^\\p{ASCII}] Remove"); 

Any-Latin部執行轉換,NFD; [:M:] Remove; NFC去除口音和[^\\p{ASCII}] Remove去除任何非-ascci字符剩餘。

您只需撥打accentsConverter.transliterate(yourString)即可獲得結果。

您可以閱讀更多關於如何在ICU Transformations guide中構建轉換標識(參數Transliterator.getInstance)的信息。

+0

但我想做一個轉換示例¥是指Y. – 2012-04-17 09:47:26

+0

像@Deco在評論中提到的,¥到Y不是正確的轉換。但是,對於這些特殊需求,您可以創建預期轉換的映射,然後首先映射到這些映射,然後將其傳遞給ICU。 – Sorin 2012-04-17 09:50:48

相關問題