在 JavaScript 中将 Hangul Jamo 转换为 Hangul 音节

j3p*_*3py 4 javascript unicode

我正在尝试以编程方式创建韩语句子,但要正确执行此操作意味着我需要一种方法来确定哪些 Hangul Jamo unicode 字符构成每个 Hangul 音节 unicode 字符。更具体地说,我想收集一些 Hangul Jamo 字符,并找出如何将它们转换为 Hangul 音节字符。简单地连接字符串是行不通的,我查看了代码点值,看看 Hangul Jamo 的代码点和组合的 Hangul 音节之间是否存在明显的关系,但我不知道见一。例如,天真地添加代码点不会产生正确的答案:

\n\n
console.log((\'\xe3\x84\xb1\'.codePointAt(0) + \'\xe3\x85\x8f\'.codePointAt(0)) === \'\xea\xb0\x80\'.codePointAt(0));\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不记录true,这在查看Hangul JamoHangul Syllables的 Unicode 图表时也是不言而喻的。到目前为止,我在搜索中还没有找到答案,但一定有一种方法可以以编程方式将部分转换为整个音节,对吧?

\n

j3p*_*3py 7

我在维基百科上找到了答案。点击该链接查看字符表,但使用的公式如下:

\n\n
\n

要查找 Unicode 中的朝鲜文音节,您可以应用一个简单的公式。公式及表格如下:\n [{(初始) \xc3\x97 588} + {(中间) \xc3\x97 28} + (最终)] + 44032

\n
\n\n

这是我在 JSFiddle 上拼凑的一个非常蹩脚的随机韩语句子生成器的示例。我使用结尾字符的值(randFin下面的最终值)来确定单词的最后一个音节是以元音还是辅音结尾。这决定了在最终的(几乎肯定难以理解的)句子中紧随其后的助词的形式。它在方法中使用了 unicode 公式getRandomKWord

\n\n

\r\n
\r\n
var getRandomInt = function(n, o) {\r\n  var min = Math.ceil(n);\r\n  var max = Math.floor(o);\r\n  return Math.floor(Math.random() * (max - min)) + min;\r\n};\r\n\r\nvar getRandomKWord = function() {\r\n  var word = \'\';\r\n  var num = getRandomInt(1, 3);\r\n\r\n  for (var i = 0; i < num; i++) {\r\n  \tvar randInit = getRandomInt(0, 19) * 588;\r\n    var randMed = getRandomInt(0, 21) * 28;\r\n    var randFin = getRandomInt(0, 28);\r\n    var hangulFormula = randInit + randMed + randFin + 44032;\r\n\r\n  \tword = word + String.fromCodePoint(hangulFormula);\r\n  }\r\n  return { word: word, final: randFin };\r\n};\r\n\r\nvar title = document.getElementById(\'title\');\r\n\r\nvar subject = getRandomKWord();\r\nvar object = getRandomKWord();  // don\'t use \'object\' as a variable name\r\nvar verb = getRandomKWord();\r\n\r\nvar subParticle = subject.final ? \'\xeb\x8a\x94\' : \'\xec\x9d\x80\';\r\nvar objParticle = object.final ? \'\xeb\xa5\xbc\' : \'\xec\x9d\x84\';\r\n\r\nvar text = subject.word +\r\n\tsubParticle +\r\n  object.word +\r\n  objParticle +\r\n  verb.word +\r\n  \'\xec\x8a\xb5\xeb\x8b\x88\xeb\x8b\xa4.\';\r\n\r\ntitle.innerText = text;
Run Code Online (Sandbox Code Playgroud)\r\n
<h1 id=\'title\'></h1>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n