2012-01-08 8 views
5

Voglio avere la tabella delle vocali con diacritics, ma non voglio cercare le tabelle dei simboli manualmente.Come generare automaticamente la tavola vocalica diacritizzata?

È possibile generare questa tabella incrociando l'elenco di vocali e l'elenco di diacritics in alcune delle seguenti lingue: Java, PHP, Wolfram Mathematica, lingue .NET e così via?

Ho bisogno di avere caratteri (unicode) come output.

Java Solution

ho trovato che ci sono una caratteristica Unicode speciale per questo: http://en.wikipedia.org/wiki/Unicode_normalization

Java supporta dal 1,6 http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

Quindi, il codice di esempio è:

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); 
} 

Ie semplicemente mettiamo insieme i segni diacritici dopo le vocali e quindi applichiamo la normalizzazione alla stringa.

+0

Si può cercare di estrarre le informazioni dal http://unicode.org/Public/UNIDATA/NamesList.txt presumo desideri solo lettere romane. Qualsiasi cosa corrisponda a LATIN SMALL | CAPITAL LETTER A | E | I | O | U WITH dovrebbe essere rilevante. Non so quanto sia robusto e se vuoi cose come ø. Inoltre, fai attenzione che Mathematica non supporta correttamente Unicode al di fuori del piano multilingue di base: http://stackoverflow.com/questions/5597013/reading-an-utf-8-encoded-text-file-in-mathematica – Szabolcs

+0

Inoltre, che cosa su cose come ...? Lo consideri una vocale (è certamente in norvegese) o no? – Szabolcs

risposta

4

ad essere onesti, non ho completamente decifrato quale codice Szabolcs' sta facendo, ma in questo caso particolare, questo sembra produrre lo stesso risultato in Mathematica usando un po 'meno il codice

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] 

che produce

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

Ho estratto un vecchio codice Mathematica che avevo, lo incollerò qui. Puoi usarlo in qualsiasi modo per farti piacere. Bug da aspettarsi!

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[_] := "" 

Ora possiamo fare sia

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

(che non include cose come AE), o

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

(filtraggio manuale necessario in questo caso per sbarazzarsi di cose come ESH - ʃ)

Quindi è possibile eseguire FromCharacterCode /@ vowelCodes, ma il carattere predefinito potrebbe non mostrare tutti i caratteri.

Il primo approccio mi dà

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

prega di notare che questo filtraggio con nomi Unicode non è robusto, e la tabella potrebbe essere facilmente mancare alcune vocali (ad esempio, io non riesco a trovare un'errati privi di punti i sopra)

+0

Grazie, è grande! – Dims

Problemi correlati