2012-01-08 10 views
5

Chcę mieć tabelę samogłosek z diacritics, ale nie chcę ręcznie wyszukiwać tabel symboli.Jak generować automatycznie diakrytycznie tabelę samogłosek?

Czy można wygenerować tę tabelę, przekraczając listę samogłosek i listę diacritics w niektórych z następujących języków: Java, PHP, Wolfram Mathematica, .NET i tak dalej?

Potrzebuję znaków (Unicode) jako wynik.

Java Rozwiązanie

Okazało się, że istnieje specjalna funkcja Unicode to: http://en.wikipedia.org/wiki/Unicode_normalization

Java wspiera go od 1,6 http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

So, przykładowy kod jest:

public static void main(String[] args) { 
    String vowels = "aeiou"; 
    char[] diacritics = {'\u0304', '\u0301', '\u0300', '\u030C'}; 
    StringBuilder sb = new StringBuilder(); 

    for(int v=0; v<vowels.length(); ++v) { 
     for(int d=0; d<diacritics.length; ++d) { 
      sb.append(vowels.charAt(v)); 
      sb.append(diacritics[d]); 

      sb.append(' '); 
     } 
     sb.append(vowels.charAt(v)); 
     sb.append('\n'); 
    } 

    String ans = Normalizer.normalize(sb.toString(), Normalizer.Form.NFC); 

    JOptionPane.showMessageDialog(null, ans); 
} 

Tzn. po prostu łączymy znaki diakrytyczne po samogłoskach, a następnie stosujemy normalizację do ciągu znaków.

+0

można spróbować wydobyć informacje z http://unicode.org/Public/UNIDATA/NamesList.txt Zakładam, że chcą tylko litery rzymskie. Wszystko, co pasuje do LATIN MAŁEJ | LITERA KAPITAŁOWEGO A | E | I | O | U Z powinno być trafne. Nie wiem, jak solidne to jest i jeśli chcesz takich rzeczy jak ø. Pamiętaj też, że Mathematica nie obsługuje poprawnie Unicode poza podstawową płaszczyzną wielojęzyczną: http://stackoverflow.com/questions/5597013/reading-an-utf-8-encoded-text-file-in-mathematica – Szabolcs

+0

Co dalej? o rzeczach takich jak ... Czy uważasz to za samogłoskę (z pewnością jest to po norwesku), czy nie? – Szabolcs

Odpowiedz

4

aby być uczciwym, ja nie całkowicie rozszyfrować co kod Szabolcs' robi, ale w tym konkretnym przypadku wydaje się produkować ten sam rezultat w Mathematica, używając nieco mniej kodu

data = Import["http://unicode.org/Public/UNIDATA/NamesList.txt", "Lines"]; 

codes = Cases[data, 
b_String /; StringMatchQ[ 
    b, ___ ~~ "LATIN " ~~ "CAPITAL" | "SMALL" ~~ " LETTER " ~~ 
    "A" | "E" | "I" | "O" | "U" ~~ " WITH " ~~ ___] :> 
    FromDigits[StringTake[b, 4], 16], Infinity]; 

FromCharacterCode[codes] 

która produkuje

"ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜàáâãäåèéêëìíîïòóôõöøùúûüĀāĂ㥹ĒēĔĕĖėĘęĚěĨĩĪīĬ\ 
ĭĮįİŌōŎŏŐőŨũŪūŬŭŮůŰűŲųƗƟƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǞǟǠǡǪǫǬǭǺǻǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍ\ 
ȎȏȔȕȖȗȦȧȨȩȪȫȬȭȮȯȰȱȺɆɇɨᶏᶒᶖᶙḀḁḔḕḖḗḘḙḚḛḜḝḬḭḮḯṌṍṎṏṐṑṒṓṲṳṴṵṶṷṸṹṺṻẚẠạẢảẤấẦầẨ\ 
ẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮ\ 
ữỰựⱥⱸⱺꝊꝋꝌꝍ" 
2

Wykopałem stary kod Mathematica, który miałem, zamierzam go tutaj wkleić. Możesz go użyć w dowolny sposób. Błędy można się spodziewać!

uninames = 
    StringSplit[ 
    Import["http://unicode.org/Public/UNIDATA/NamesList.txt", "Text"], 
    "\n"]; 

uniNameList = ({ToExpression["16^^" <> First[#]], 
     [email protected][Rest[#], "\n"]} & /@ 
    DeleteCases[ 
    Flatten /@ 
     Split[StringSplit[#, "\t" .., All] & /@ Take[uninames, All], 
     First[#2] === "" &] /. "" -> Sequence[], 
    x_ /; StringTake[First[x], 1] === "@"]); 

uniRangeList = {FromDigits[#1, 16], 
    FromDigits[#3, 15], #2} & @@@ (Rest /@ 
    Select[StringSplit[#, "\t"] & /@ uninames, First[#] == "@@" &]); 

Clear[unicodeName] 
Set[unicodeName[#1], #2] & @@@ uniNameList; 
Set[unicodeName[n_Integer /; #1 <= n <= #2], #3] & @@@ uniRangeList; 
unicodeName[s_String /; StringLength[s] === 1] := 
unicodeName[[email protected][s]] 
unicodeName[_] := "" 

Teraz możemy zrobić albo

vowelCodes = Select[ 
    uniNameList[[All, 1]], 
    StringMatchQ[unicodeName[#], 
    "LATIN " ~~ "SMALL" | "CAPITAL" ~~ " LETTER " ~~ 
    "A" | "E" | "I" | "O" | "U" ~~ " WITH" ~~ ___] & 
    ] 

(który nie obejmuje rzeczy jak AE), lub

vowelCodes = Select[ 
    uniNameList[[All, 1]], 
    StringMatchQ[unicodeName[#], 
    "LATIN " ~~ "SMALL" | "CAPITAL" ~~ " LETTER " ~~ 
    "A" | "E" | "I" | "O" | "U" ~~ ___] & 
    ] 

(ręcznego filtrowania potrzebne w tym przypadku, aby pozbyć się rzeczy jak ESH - ʃ)

Następnie można zrobić FromCharacterCode /@ vowelCodes, ale domyślna czcionka może nie wyświetlać wszystkich znaków.

Pierwsze podejście daje mi

"ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜàáâãäåèéêëìíîïòóôõöøùúûüĀāĂ㥹ĒēĔĕĖėĘęĚěĨĩĪīĬ\ 
ĭĮįİŌōŎŏŐőŨũŪūŬŭŮůŰűŲųƗƟƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǞǟǠǡǪǫǬǭǺǻǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍ\ 
ȎȏȔȕȖȗȦȧȨȩȪȫȬȭȮȯȰȱȺɆɇɨᶏᶒᶖᶙḀḁḔḕḖḗḘḙḚḛḜḝḬḭḮḯṌṍṎṏṐṑṒṓṲṳṴṵṶṷṸṹṺṻẚẠạẢảẤấẦầẨ\ 
ẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮ\ 
ữỰựⱥⱸⱺꝊꝋꝌꝍ" 

Należy pamiętać, że filtrowanie według nazwy Unicode nie jest mocny, a tabela może być łatwo brakuje niektórych samogłosek (np ja nie potrafię znaleźć bez kropki I powyżej)

+0

Dzięki, jest duży! – Dims

Powiązane problemy