2012-01-08 17 views
5

Quiero tener la tabla de vocales con diacritics, pero no quiero buscar tablas de símbolos manualmente.¿Cómo generar tablas vocálica diacritizadas automáticamente?

¿Es posible generar esta tabla cruzando la lista de vocales y la lista de diacritics en algunos de los siguientes lenguajes: Java, PHP, Wolfram Mathematica, lenguajes .NET, etc.

Necesito tener caracteres (unicode) como salida.

Java Solución

he encontrado que hay una característica Unicode especial para esto: http://en.wikipedia.org/wiki/Unicode_normalization

Java soporta desde 1.6 http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

Por lo tanto, el código de ejemplo es:

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 simplemente colocamos signos diacríticos combinados después de las vocales y luego aplicamos la normalización a la cuerda.

+0

Usted puede tratar de extraer la información de http://unicode.org/Public/UNIDATA/NamesList.txt Asumo solo deseas letras romanas. Cualquier cosa que coincida con LETIN SMALL | MAYÚSCULA LETRA A | E | I | O | U CON debe ser relevante. No sé cuán robusto es esto y si quieres cosas como ø. Además, tenga en cuenta que Mathematica no admite adecuadamente Unicode fuera del plano multilingüe básico: http://stackoverflow.com/questions/5597013/reading-an-utf-8-encoded-text-file-in-mathematica – Szabolcs

+0

Además, ¿qué sobre cosas como æ? ¿Lo considera una vocal (ciertamente está en noruego) o no? – Szabolcs

Respuesta

4

para ser honesto, no he descifrado por completo qué código Szabolcs' está haciendo, pero en este caso particular, esto parece producir el mismo resultado en Mathematica usando un poco menos código

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] 

que produce

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

Rebusqué un viejo código de Mathematica que tenía, voy a pegarlo aquí. Puedes usarlo de cualquier forma para complacer. ¡Errores que se esperan!

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

Ahora podemos hacer ya sea

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

(que no incluye cosas como AE), o

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

(filtrado manual necesaria en este caso para deshacerse de las cosas como ESH - ʃ)

Luego puede hacer FromCharacterCode /@ vowelCodes, pero es posible que la fuente predeterminada no muestre todos los caracteres.

El primer enfoque me da

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

Tenga en cuenta que este filtrado por nombres Unicode no es robusto, y la mesa podría ser fácilmente faltan algunas vocales (por ejemplo, me parece que no puede encontrar un i sin punto por encima)

+0

¡Gracias, es grande! – Dims

Cuestiones relacionadas