在JavaScript中将韩语Jamo转换为韩语音节

在JavaScript中将韩语Jamo转换为韩语音节,javascript,unicode,Javascript,Unicode,我试图通过编程方式创建韩语句子,但要正确地创建韩语句子,意味着我需要一种方法来确定每个韩国语音节unicode字符由哪个韩国语Jamo unicode字符组成。更具体地说,我想收集一些韩国语Jamo字符,并找出如何将它们转换成韩国语音节字符。简单地连接字符串是行不通的,我查看了代码点的值,看看韩国语Jamo的代码点和组合的韩国语音节之间是否有明显的关系,但我没有看到。例如,单纯地添加代码点并不能得到正确的答案: console.log(('ㄱ'.codePointAt(0) + 'ㅏ'.code

我试图通过编程方式创建韩语句子,但要正确地创建韩语句子,意味着我需要一种方法来确定每个韩国语音节unicode字符由哪个韩国语Jamo unicode字符组成。更具体地说,我想收集一些韩国语Jamo字符,并找出如何将它们转换成韩国语音节字符。简单地连接字符串是行不通的,我查看了代码点的值,看看韩国语Jamo的代码点和组合的韩国语音节之间是否有明显的关系,但我没有看到。例如,单纯地添加代码点并不能得到正确的答案:

console.log(('ㄱ'.codePointAt(0) + 'ㅏ'.codePointAt(0)) === '가'.codePointAt(0));
它不记录
true
,这在查看和的Unicode图表时也是不言而喻的。到目前为止,我在搜索中还没有找到答案,但一定有办法通过编程将部分转换为整个音节,对吗?

我找到了答案。按照该链接查找字符表,但使用的公式如下:

要查找Unicode中的韩语音节,可以应用一个简单的公式。公式和表格如下: [{(首字母)×588}+{(中字母)×28}+(末字母)]+44032

。我使用结尾字符的值(下面最后的
randFin
值)来确定单词的最后一个音节是以元音还是辅音结尾。这决定了在结果(几乎可以肯定是不可理解的)句子中后面的粒子的形式。它在
getRandomKWord
方法中使用unicode公式:

var getRandomInt=函数(n,o){
var min=数学单元(n);
var max=数学地板(o);
返回Math.floor(Math.random()*(max-min))+min;
};
var getRandomKWord=函数(){
var-word='';
var num=getRandomInt(1,3);
对于(变量i=0;i

所有构成有效韩国语音节的jamo序列都以Unicode中的预合成字符存在。此外,所有此类预合成字符都具有jamo序列的规范分解,这意味着规范化形式C中的任何文本都将具有这些预合成字符,而不是jamo序列

因此,简单地规范化由jamo组成的字符串将产生尽可能多的预合成音节。这可以在JavaScript中通过
s.normalize(“NFC”)
实现

如果您不关心jamo序列或预合成音节,而只关心比较相等的结果,那么您可以将字符串规范化为任意一种规范化形式(C或D),只要它们具有相同的形式

同样相关的是,标准化表格C将包含jamo而不是音节的情况列表:

如果文本是NFD格式,那么它将只包含Jamo。如果是NFC (或未规范化),大多数文本都是韩语音节。然而,杰莫 在某些情况下可能发生:

(a) 孤立Jamo
(b) 1933年以前的正字法韩文文本
(c) 现代不完整音节(例如,没有主音辅音的音节) 用于字典和语法书)
(d) 音节用于一个更复杂的词 某些方言的忠实语音表达

在后一种情况下,有两种可能性。如果L或V是 古雅莫语,那么整个音节都是雅莫语。如果两者都是 现代的Jamo但是T是古代的,那么音节应该是 由两个字符的序列表示:用于 LV,后跟T的代码点:

这与拉丁语的情况类似。NFC形式的A+坟墓+ umlaut is:部分预合成,其余部分为 不是


谢谢你这篇内容丰富的帖子。我有一些后续工作要做,看看如何更具体地利用这一点。我会回来报告的。我发现第一个答案中的方法更适合我用编程方式创建韩语句子的用例,所以我将接受这个答案,但谢谢你
str.normalize('NFC')
工作正常,可能对其他人有好处。请看。