我希望使用diacritics的元音表,但不想手动搜索符号表。
是否可以通过以下某些语言中的元组列表和diacritics列表生成此表:Java,PHP,Wolfram Mathematica,.NET语言等等?
我需要输入字符(unicode)。
Java解决方案
我发现有一个特殊的Unicode功能:http://en.wikipedia.org/wiki/Unicode_normalization
自1.6 http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html
以来,Java支持它因此,示例代码为:
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 :(得分: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]
产生
"ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜàáâãäåèéêëìíîïòóôõöøùúûüĀāĂ㥹ĒēĔĕĖėĘęĚěĨĩĪīĬ\
ĭĮįİŌōŎŏŐőŨũŪūŬŭŮůŰűŲųƗƟƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǞǟǠǡǪǫǬǭǺǻǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍ\
ȎȏȔȕȖȗȦȧȨȩȪȫȬȭȮȯȰȱȺɆɇɨᶏᶒᶖᶙḀḁḔḕḖḗḘḙḚḛḜḝḬḭḮḯṌṍṎṏṐṑṒṓṲṳṴṵṶṷṸṹṺṻẚẠạẢảẤấẦầẨ\
ẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮ\
ữỰựⱥⱸⱺꝊꝋꝌꝍ"
答案 1 :(得分: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名称进行的过滤并不健全,并且该表可能很容易丢失一些元音(例如,我似乎无法在上面找到无点的)