我正在尝试在我的iPhone应用程序中显示韩语文本。该应用程序将字母的Unicode一对一地附加到NSMutableString上,并在附加每个字母后在屏幕上显示该字符串。

我了解对连字有一些规则(Jamo)。

是否具有将所有这些规则自动应用到字母字符串的功能,还是我需要编写代码进行更改(例如,如果前面有元音,则将辅音更改为尾辅音)?

最佳答案

FCA。是您发电子邮件给我的,对吗?因为这里有更详细的问题,所以我将(尽我最大的努力)在这里回答,而不是回复您的电子邮件。

通过阅读您和人们在这里写的全文,我发现您正在制作朝鲜语手写识别软件。因此,您将无法享受Apple提供的韩语输入法所带来的奢华。

我有两件事要说。我们一个接一个地走。 (我相信您已经意识到我要解释的两件事之一。)

  • 如何撰写韩文文本。

    因此,通过阅读您的查询,它应该与Unicode组合/分解的韩文字符串(或只是一系列Ja(辅音)和Mo(Vowels))无关。您的问题似乎与“如何确定用户写的辅音(您的术语是尾辅音,对吗?)是下一个音节的最后一个辅音还是起始辅音有关。
    最好的事情是学习韩语,但让我简要解释一下。

  • 假设您写소방차(消防部门的车)。
    你要写:ㅅㅗㅂㅏㅇㅊㅏ
    (同样,我不是在谈论Unicode的分解形式。它是关于人们如何编写韩文的。)

    当您临时输入ㅗ(它是第二个字符)时,显示系统通过将attach附加到其前面的ㅅ来显示소。它将查找韩国表。 (尽管组装韩文的方式是JoHap风格(조합형),也就是复合风格,但是在任何韩文标准中都定义了允许的韩文表格,称为Wansung风格(완성형)。因此,您需要测试“表格中是否有这样的音节)。然后,您将在表中找到“소”。因此,您将显示“소”。

    现在,下一个字符“ㅂ”被写入。然后,这里变得有点复杂。因为表中有一个音节“솝”,所以它首先会将attach附加到前一个音节。因此,它将显示“솝”。但是,事情还没有完全确定。用户写下一个字符“ㅏ”。可以肯定的是,没有第一个/开始的辅音(Ja)不会有音节。它将查找表,但找不到音节“ㅏ”。

    因此,它将猜测附加到前一个音节的ㅂ(由ㅅ编辑而成,是错字)实际上属于第二个音节。并且应该显示“소바”。现在,键入ㅇ。然后,它尝试将attach附加到第二个音节。因此显示displays。 (此时,它也可以在表中查找.。并且已找到。)

    现在,键入“ㅊ”。可能在内部它可以测试under在o下存在o和ㅊ的地方(我无法编写它,因为在under下不存在o和with一起存在的音节,如ㅊ。)。但是,没有这样的音节。因此,它立即确定ㅊ属于下一个音节。

    然后键入“ㅏ”。它将ㅊ和ㅏ组装成ㅏ。当您按下空格键或返回键或任何其他空格键时,它将完成组成韩文。

    这是一个简单的情况。在朝鲜语中,有更复杂的音节,如빨,꼭,헗等。对于第一个辅音,빨(꼭)中的like(BokJaUm,双辅音)如like,ㄲ,人们通过按Shift键输入ㅂ和ㅅ。然后将显示ㅃ和ㄲ。因此,如果用户使用键盘输入,拾起辅音的方式并确定其所属位置(上一个音节或下一个音节)将很容易。 (但是,对于Windows和Xterm,有一些不错的韩文输入法,其中允许两次键入to来制作ㅃ。这是一种智能功能。但是测试빱빠라빱,흙을之类的文本可能会很复杂,因为您最终要进行测试3或4个辅音,例如{1,3},{2,2},{3,1}。

    坏消息是...因为您正在编写手写识别,因此,如果您将识别出的韩文字符逐一输入到韩文输入法引擎中,则可能需要处理这种复杂情况。但是,如果您在应用程序中编写自己的输入法,则可以维护其自己的状态机,这样会更容易。但是正如您所看到的,这是一个权衡。取决于现有的输入法引擎并将每个字符吸收到其中。 (嗯...等等...也许输入法引擎也可以处理那些复杂的情况。)

    仅供参考,我想介绍两个开源项目。一个是Korean input method Finder module for Mac,另一个是an input method engine,您可以使用它来创建韩语输入法。另外,对于X-Windows托管的here也有韩文输入法。如果您希望查找Windows项目,请输入here is one

    后两者托管在韩国开源项目托管网站KLDP.net上,但是它们已移至Google代码。据我所记得,“SaeNaRu”和“Nabi”(蝴蝶)可以支持两次键入相同的辅音以构成双辅音。

    有关更多详细信息,您可以查找libhangul和nabi。 (我记得在libhangul和nabi之间,代码的输入法部分几乎是相同的。但是在那时,它们是分开的,并且有望独立发展。因此,我想它们是不同的。

    好。第一件事完成了。

    现在让我们继续第二个问题。 (这是我说过的您可能已经知道的部分。但是,为了完成我的解释,让我也解释一下。)

    这是关于选择什么字符作为可能的韩文输入法状态机或libhangul之类的引擎的输入。组成(显示)的韩文字符基本上有两种表示形式:组成和分解。组成一个包含完全组成的字符。例如对于사랑합니다,每个音节사,랑,합,니,니,다都保存为原样。它们不存储为ㅅ,ㅏ,ㄹ,ㅏ,ㅇ,ㅎ,ㅏ,ㅂ,ㄴ,ㅣ,ㄷ,ㅏ。
    这是用Unicode组成的表示形式。此表示形式通常由文本编辑器等使用。另一个表示形式以Unicode分解。就像ㅅ,ㅏ,ㄹ,ㅏ,ㅇ,ㅎ,ㅏ,ㅂ,ㄴ,ㅣ,ㄷ,ㅏ。

    该表示通常由文件系统使用。例如,如果在Windows上将文件名放在Hangul中,然后从Mac访问包含该文件名的文件夹,尽管在Windows上将其显示为사랑합니다,但该文件名将显示为ㅅㅏㄹㅏㅇㅎㅏㅂㄴㅣㄷㅏ。

    但是,如果有记忆,则还有另一组字符,这只是韩文辅音和元音的列表。尽管它们看起来与分解的音节相同或相似,但实际上它们的区别在于,它们的绘制位置在绘制字符的空间的中间。其目的是在韩文字母表中显示韩文字符或用于教育目的(或任何其他目的)之类的东西。

    因此,我不确定要选择或实现的输入法状态机或输入法引擎要吸收哪些字符(即分解的字符或韩文辅音和元音列表的字符)。如果要实现它,它是您的选择,但是如果您对引擎使用一些外部库,则需要弄清楚它。

    而且,正如我在博客文章中提到的那样,每种组合表示形式和分解表示形式都有两种变体,它们均以Unicode标准定义。所以,嗯..是的。我同意。这是很多工作。

    对于我来说,我试图为Mac输入一种方法(当Apple宣布他们将摆脱Finder插件体系结构以解决安全问题时),但是那时libhangul(是的。我试图使用它)正在被更改。很多。因此,直到稳定下来,我才决定推迟。但是由于我在工作中变得非常忙碌而回到家后又很累,所以我在自己的输入法上并没有取得进步。因此,我相信libhangul项目的状态现在比以往任何时候都要好得多。因此,至少要看看它是一个很好的尝试。

    另外,如果您没有Windows,最好尝试使用hanterm或任何本身支持Hangul输入的xterm派生工具。源代码将在其托管网站上提供。

    祝您的项目好运,如果还有其他事情要问我,请这样做。

    07-24 21:29