如何将韩文单词解构为其字母组成部分?

问题描述 投票:0回答:1

我正在尝试将韩语单词列表解构为 C# 中的字母组件。

输入:

루돌프사슴코

输出:

ㄹㅜㄷㅜㄹㅍㅡㅅㅏㅅㅡㅁㅋㅗ

使用

var text = "루돌프사슴코";
String a = text.Normalize(NormalizationForm.FormD);
foreach (var c in a)
{
    Debug.Write(c);
}

这会产生 Hangul Jamo 字符,其中字母具有位置元素。我只想要简单的字母表。

有人有想法吗?

c# cjk
1个回答
0
投票

首先你必须了解 unicode 的工作原理。 这是关于它的精彩视频

之后,这是关于这个确切问题的维基百科文章。以及带有反向方程的文章如何从 unicode 获取字符这里

我的解决方案:


var text = "루돌프사슴코";
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine(Encoding.Unicode.GetByteCount(text));
foreach (var word in text)
{
    Console.WriteLine($"{word} => {(int)word} => (initial) × 588 + (medial) × 28 + (final) = {word - 44032}");
}
Console.WriteLine("END");
Console.WriteLine(text.Normalize(NormalizationForm.FormD));

String a = text.Normalize(NormalizationForm.FormD);
foreach (var c in a)
{
    Console.Write(c);
}

var firstWord = '루';
var tail = ((int)firstWord - 44032) % 28;
var vowel = 1 + (((int)firstWord - 44032 - tail) % 588) /28;
var lead = 1 + ((int)firstWord - 44032) / 588;
Console.WriteLine();
var leadInUnicode = LeadUnicode(lead);
Console.WriteLine(leadInUnicode);
var vowelInUnicode = VowelUnicode(vowel);
Console.WriteLine(vowelInUnicode);
var tailInUnicode = TailUnicode(tail);
Console.WriteLine(tailInUnicode);


char LeadUnicode(int lead)
{
    return (char)(lead + 4351);
}

char VowelUnicode(int vowel)
{
    return (char)(vowel + 4448);
}

char TailUnicode(int tail)
{
    return (char)(tail + 4520);
}

有输出:

12
루 => 47336 => (initial) × 588 + (medial) × 28 + (final) = 3304
돌 => 46028 => (initial) × 588 + (medial) × 28 + (final) = 1996
프 => 54532 => (initial) × 588 + (medial) × 28 + (final) = 10500
사 => 49324 => (initial) × 588 + (medial) × 28 + (final) = 5292
슴 => 49844 => (initial) × 588 + (medial) × 28 + (final) = 5812
코 => 53076 => (initial) × 588 + (medial) × 28 + (final) = 9044
END
루돌프사슴코
루돌프사슴코
ᄅ
ᅮ
ᆨ

© www.soinside.com 2019 - 2024. All rights reserved.