2010-08-24 54 views
8

我正試圖從波蘭語中的潘蘭語中刪除變音符號。我使用Michael Kaplan的博客http://www.siao2.com/2007/05/14/2629747.aspx的代碼,但沒有成功。刪除波蘭語中的變音符號

請考慮以下pangram:「Pchnąćwtęłódźjeżalubośmskrzyńfig。」。一切正常,但對於信「ł」,我仍然得到「ł」。我想問題是「ł」被表示爲單個Unicode字符,並且沒有以下NonSpacingMark。

你有什麼想法我可以修復它(不依賴於某些字典中的自定義映射 - 我正在尋找某種類型的Unicode轉換)?

回答

3

在文章中採取的方法是刪除標記,非空字符。既然你正確地指出「ł」不是由兩個字符(其中之一是標記,非空間)組成,你所看到的行爲是預期的。

我不認爲Unicode的結構允許你完成一個完全自動的重新映射(你引用的文章的作者達到了相同的結論)。

如果您只是對波蘭字符感興趣,至少映射很小並且定義明確(參見例如http://www.biega.com/special-char.html的底部)。對於一般情況,我不認爲對於不是由標準字符加上Mark,Nonspacing字符組成的字符存在自動化解決方案。

2

它在Unicode chart,codepoint \ u0142。向下滾動到描述「帶筆畫的拉丁小寫字母」,它沒有列出分解。不知道波蘭語的任何信息,但是一封信有一個區分標記,這使得它成爲自己的字母,而不是帶有變音符號的基本字母。

1

有很多預分解字符沒有有意義的分解。 (還有一小部分可以進行合理的分解,這些分解在大多數規範化形式中被禁止進行分解,因爲這會導致版本之間的差異,從而導致它們不再真正正常化)。

ł是其中之一。 IIRC也不可能對不使用ł的字母進行文化中性轉錄。我認爲德國人傾向於把它轉錄成w而不是l(或者也許是別人的),這是有道理的(它也不完全正確,但它比l更接近)。

2

您將不得不手動替換這些(就像拉丁語-1中的ÆÐØÞßæðøþ)。

其他人也有同樣的問題,所以Unicode通用語言環境數據存儲庫「已同意添加音譯刪除口音,即使是重疊的口音。」 (Ticket #2884

2

這裏是我使用波蘭變音符正常化的波蘭停止列表的快速實現。

class StopList 
{ 
    private HashSet<String> set = new HashSet<String>(); 

    public void add(String word) 
    { 
     word = word.trim().toLowerCase(); 
     word = normalize(word); 
     set.add(word); 

    } 

    public boolean contains(final String string) 
    { 
     return set.contains(string) || set.contains(normalize(string)); 
    } 

    private char normalizeChar(final char c) 
    { 
     switch (c) 
     { 
      case 'ą': 
       return 'a'; 
      case 'ć': 
       return 'c'; 
      case 'ę': 
       return 'e'; 
      case 'ł': 
       return 'l'; 
      case 'ń': 
       return 'n'; 
      case 'ó': 
       return 'o'; 
      case 'ś': 
       return 's'; 
      case 'ż': 
      case 'ź': 
       return 'z'; 
     } 
     return c; 
    } 

    private String normalize(final String word) 
    { 
     if (word == null || "".equals(word)) 
     { 
      return word; 
     } 
     char[] charArray = word.toCharArray(); 
     char[] normalizedArray = new char[charArray.length]; 
     for (int i = 0; i < normalizedArray.length; i++) 
     { 
      normalizedArray[i] = normalizeChar(charArray[i]); 
     } 
     return new String(normalizedArray); 
    } 
} 

我無法在網絡中找到任何其他解決方案。因此,也許這將是有益的人

+0

期待的'ł'所有這些字符都只是[附加符號](HTTP://en.wikipedia。org/wiki/Diacritic)(我看到的至少是ogonek,尖銳和點),並且可以使用'Normalize'輕鬆標準化。我建議結合這兩種方法。 – BalusC 2010-09-28 16:23:04

+0

Normalize是.NET庫嗎?對不起......這是從我的Java代碼片段:)並寫「網」我想到的是InterNet,而不是「.NET」。 – 2010-09-29 08:45:36

2

前段時間我遇到這樣的解決方案,這似乎很好地工作(?):

public static string RemoveDiacritics(this string s) 
    { 
     string asciiEquivalents = Encoding.ASCII.GetString(
        Encoding.GetEncoding("Cyrillic").GetBytes(s) 
       ); 

     return asciiEquivalents; 
    } 
+0

這就像一個魅力的偉大作品 – lag 2017-04-05 13:38:46