5

我想要带有变音符号的元音表,但不想手动搜索符号表。

是否可以通过交叉以下某些语言的元音列表和变音符号列表来生成此表: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);
}

即我们只是在元音后面加上变音符号,然后对字符串应用规范化。

4

2 回答 2

4

老实说,我还没有完全理解 Szabolcs 的代码在做什么,但在这种特殊情况下,这似乎在 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]

产生

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

我挖掘了一些旧的 Mathematica 代码,我将把它粘贴在这里。你可以用任何方式取悦它。可以预料的错误!

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

uniNameList = ({ToExpression["16^^" <> First[#]], 
      StringJoin@Riffle[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[First@ToCharacterCode[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 名称进行的过滤并不可靠,并且该表可能很容易丢失一些元音(例如,我似乎无法在上面找到一个无点的 i)

于 2012-01-08T13:10:23.427 回答