2017-02-27 20 views
2

韓国語の文章をプログラムで作成しようとしていますが、適切に行うには、どのハングルJamoユニコード文字が各ハングルシラブルユニコード文字を構成するかを判断する方法が必要です。具体的には、ハングル・ジャモの文字を集め、ハングル・シラブル文字に変換する方法を解説します。単に文字列を連結するだけでは機能しません。コードポイントの値を調べて、ハングルJamoのコードポイントと結合されたハングルの音節の間に明確な関係があるかどうかを確認しましたが、表示されません。例えば、単純にコードポイントを追加すると、正しい答えにはなりません。JavaScriptでハングルJamoをハングルの音節に変換する

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

それはHangul JamoHangul SyllablesのためのUnicodeのチャートを見ているときも自明であるtrueを記録しません。私はこれまでの検索で答えを見つけられませんでしたが、部分的に音節全体にプログラム的に変換する方法が必要です。

答えて

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の式を使用する:有効な韓国語音節を形成JAMOの

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

すべてのシーケンスは、Unicodeで合成済み文字として存在します。さらに、このような事前合成された文字はすべてjamoのシーケンスに対して標準的な分解をします。つまり、正規化フォームC内のテキストには、jamoシーケンスではなく、あらかじめ合成された文字が含まれます。

したがって、単純にjamo​​で構成される文字列を正規化すると、できるだけ多くの事前合成された音節が得られます。これはs.normalize("NFC")でJavaScriptで行うことができます。

jamoシーケンスやあらかじめ合成された音節を気にせず、等価の比較結果のみを気にしている場合は、両方とも正規化形式(CまたはD)に正規化できます同じ形。テキストがNFDである

場合は、それが唯一の字母が含まれます。また

関連は、Unicode FAQ on Koreanは正規化形式Cは、音節の代わりにJAMOが含まれています状況のリストを持っています。 NFC (または非正規化)の場合、ほとんどのテキストはハングルの音節になります。しかし、字母 は、特定の状況で発生する可能性:

(A)字母
(b)のプレ1933正書法韓国語テキスト
(C)モダン不完全音節(例えば、単離され辞書や文法書で使用 として主要子音無し音節)、後者の場合、いくつかの方言

のより 忠実な音声表現に使用
(D)音節、2つの可能性があります。 LまたはVが 古代Jamoの場合、音節全体はJamoになります。 LVのための単一のコードポイント、Tのためのコード・ポイントが続い:< LV、T >

両方が 現代の字母ですが、Tは、古代のであれば、音節は、2つの文字の配列で表さ だろう

これはラテン語の場合と似ています。 A +墓地のNFC形式+ ウムラウトは< A-墓地、ウムラウト>です:部分はあらかじめ合成され、残りは ではありません。

+0

この有益なポストをありがとう。私はこれをより具体的にどのように活用できるかを見るためにいくつかのフォローアップを行っています。私は戻って報告します。 – j3py

+1

最初の答えの方法は、プログラムで韓国語の文章を作成するという私の使用例に、より密接に適合することがわかったので、私はその答えを受け入れるつもりですが、これに感謝します。 '' 'str.normalize( 'NFC')' ''は動作し、他の人には良いかもしれません。 – j3py

関連する問題