2017-02-27 25 views
2

我正在嘗試以編程方式創建韓語句子,但這樣做需要一種方法來確定哪個Hangul Jamo Unicode字符組成了每個Hangul Syllable Unicode字符。更具體地說,我想收集一個韓文Jamo字符集,並找出如何將它們轉換成韓語音節字符。簡單地連接字符串將不起作用,並且我已經查看了代碼點值以查看Hangul Jamo的代碼點和合並的Hangul Syllable之間是否存在明顯的關係,但是我沒有看到它們之一。例如,天真地添加代碼點不會導致對正確答案:將Hangul Jamo轉換爲使用JavaScript的Hangul音節

console.log(('ㄱ'.codePointAt(0) + 'ㅏ'.codePointAt(0)) === '가'.codePointAt(0)); 

它不記錄true看的Unicode圖表爲Hangul JamoHangul Syllables時,這也是不言而喻的。到目前爲止,我還沒有找到答案,但是必須有一種以編程方式將部分轉換爲整個音節的方法,對嗎?

回答

2

我找到了答案on Wikipedia。按照該鏈接的字符表,但這裏是使用的公式:

要查找的Unicode韓文音節,你可以申請一個簡單的公式。式和表如下所示: [{(初始)×588} + {(內側)×28} +(最終)] + 44032

Here's an example of a really crappy random Korean sentence generator I threw together on JSFiddle。我使用結尾字符的值(最後的randFin值)來確定該單詞的最後一個音節是否以元音或輔音結尾。這決定了它在結果(幾乎肯定是不可理解的)句子中出現的粒子形式。它使在getRandomKWord方法使用Unicode式:

var getRandomInt = function(n, o) { 
 
    var min = Math.ceil(n); 
 
    var max = Math.floor(o); 
 
    return Math.floor(Math.random() * (max - min)) + min; 
 
}; 
 

 
var getRandomKWord = function() { 
 
    var word = ''; 
 
    var num = getRandomInt(1, 3); 
 

 
    for (var i = 0; i < num; i++) { 
 
    \t var randInit = getRandomInt(0, 19) * 588; 
 
    var randMed = getRandomInt(0, 21) * 28; 
 
    var randFin = getRandomInt(0, 28); 
 
    var hangulFormula = randInit + randMed + randFin + 44032; 
 

 
    \t word = word + String.fromCodePoint(hangulFormula); 
 
    } 
 
    return { word: word, final: randFin }; 
 
}; 
 

 
var title = document.getElementById('title'); 
 

 
var subject = getRandomKWord(); 
 
var object = getRandomKWord(); // don't use 'object' as a variable name 
 
var verb = getRandomKWord(); 
 

 
var subParticle = subject.final ? '는' : '은'; 
 
var objParticle = object.final ? '를' : '을'; 
 

 
var text = subject.word + 
 
\t subParticle + 
 
    object.word + 
 
    objParticle + 
 
    verb.word + 
 
    '습니다.'; 
 

 
title.innerText = text;
<h1 id='title'></h1>

2

形成有效韓國音節所有JAMO的序列存在如以Unicode預組成字符。另外,所有這些預分解字符都對jamo序列進行了規範分解,這意味着規範化表格C中的任何文本都將具有這些預先組合的字符,而不是jamo序列。

因此,簡單地對由jamo組成的字符串進行規範化將導致儘可能多的預先組合音節。這可以用s.normalize("NFC")在JavaScript中完成。

如果你不關心有jamo序列或預合成的音節,但只關心比較相等的結果,那麼你可以規範化字符串爲標準化形式(C或D),只要你他們都有相同的形式。

也與此有關,該Unicode FAQ on Korean有哪裏範式C將包含JAMO而不是音節的情況列表:

如果文本中NFD,那麼它只會包含尊寶。如果它在NFC (或非標準化)中,大多數文本將是Hangul音節。然而,尊寶 可以發生在某些情況下:

(a)中分離的尊寶
(b)中預1933正字韓語文本
(c)中不完全現代音節(例如沒有前導輔音如 在字典和語法書使用)
(d)音節用於一些方言

在後一種情況的一個更忠實 語音表示音節,有兩種可能性。如果L或V是古老的Jamo ,那麼整個音節將在Jamo中。如果兩者都 現代尊寶,但T是古老的,那麼音節是由兩個字符序列表示 :單碼點 LV,然後碼點爲T:< LV,T >

這與拉丁文的情況類似。 A +墳墓的NFC形式+ 變音符號是< A-grave,變音符號>:部分是預分解的,其餘部分不是 。

+0

謝謝你這個內容豐富的帖子。我有一些後續工作要看我如何更具體地利用這一點。我會回報。 – j3py

+1

我發現第一個答案中的方法更貼近我編程創建韓語句子的用例,所以我打算接受該答案,但是非常感謝。 '''str.normalize('NFC')'''可以適用於其他人。 – j3py