2012-01-08 3 views
5

Я хочу иметь таблицу гласных с diacritics, но не хочу искать таблицы символов вручную.Как автоматически генерировать диакритическую гласную таблицу?

Возможно ли сгенерировать эту таблицу путем пересечения списка гласных и списка diacritics на следующих языках: Java, PHP, Wolfram Mathematica, языки .NET и т. Д.?

Мне нужно иметь символы (unicode) в качестве вывода.

Java Решение

я обнаружил, что есть специальная функция Unicode для этого: http://en.wikipedia.org/wiki/Unicode_normalization

Java поддерживает его, так как 1,6 http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

Итак, образец кода:

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

Т.е. мы просто добавляем сочетание диакритики после гласных, а затем применяем нормализацию к строке.

+0

Вы можете попытаться извлечь информацию из http://unicode.org/Public/UNIDATA/NamesList.txt Я предполагаю, что вы хотите только латинские буквы. Все, что соответствует LATIN SMALL | CAPITAL LETTER A | E | I | O | U WITH, должно быть релевантным. Я не знаю, насколько это здорово, и если вам нужны такие вещи, как ø. Кроме того, будьте осторожны, что Mathematica не поддерживает Unicode за пределами Basic Multilingual Plane: http://stackoverflow.com/questions/5597013/reading-an-utf-8-encoded-text-file-in-mathematica – Szabolcs

+0

Кроме того, что о таких вещах, как æ? Вы считаете это гласным (это, конечно, на норвежском языке) или нет? – Szabolcs

ответ

4

чтобы быть честным, я не полностью расшифрована, что делает код Сабольч, но в данном случае это, кажется, тот же самый результат в Mathematica, используя немного меньше кода

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] 

который производит

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

Я выкопал старый код Mathematica, который у меня был, я собираюсь вставить его здесь. Вы можете использовать его любым способом, чтобы понравиться. Ожидаются ошибки!

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

Теперь мы можем сделать либо

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

(которая не включает в себя такие вещи, как АЭ), или

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

(ручной фильтрации, необходимой в этом случае, чтобы избавиться от вещей как ESH - ʃ)

Тогда вы можете сделать FromCharacterCode /@ vowelCodes, но шрифт по умолчанию может не отображать все символы.

Первый подход дает мне

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

Обратите внимание, что фильтрация по именам Unicode не является устойчивой, и таблица может быть легко отсутствуют некоторые гласные (я не могу показаться, например, найти Dotless я выше)

+0

Спасибо, он большой! – Dims

Смежные вопросы