显示韩文字符 - iOS App

时间:2012-10-22 05:52:15

标签: objective-c ios unicode internationalization cjk

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

据我所知,联合字母有一些规则(Jamo)。

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

3 个答案:

答案 0 :(得分:7)

FCA。是谁给我发了电子邮件,对吗?因为这里有更详细的问题,我会尽量(最好)在这里回答,而不是回复你的电子邮件。

通过阅读你和人们在这里写的全文,我发现你正在制作韩国手写识别软件。所以,你不会享受Apple提供的韩国输入法的奢侈。

我要说两件事。让我们逐一进行。 (我相信你已经知道我要解释的两件事之一。)

  1. 如何撰写韩文文本。

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

  2. 让我们说你写소방차(消防部门。汽车。) 你要写:ㅅㅗㅂㅏㅇㅊㅏ (我再也不是在讨论Unicode的分解形式。它是关于人们如何撰写韩文文本的。)

    当您暂时键入ㅗ(第二个字符)时,显示系统会通过将attaching附加到其前面的ㅅ来显示소。它会查找韩国餐桌。 (虽然如何组装Hangul是JoHap风格(조합형),这被称为复合风格,但是在任何韩国标准中都有一个允许的韩文文本表,称为Wansung风格(완성형)。所以,你要测试"组装& #34;音节到表格,看是否有这样的音节)。然后你会发现"소"在表中。因此,您将显示"소"。

    现在是下一个字母,"ㅂ"是写的。然后在这里变得有点复杂。因为有一个音节"솝"在表格中,首先它将ㅂ附加到前一个音节。因此,它将显示"솝"。然而,事情还没有完全确定。用户编写下一个字符,"ㅏ"。没有第一个/开始辅音(Ja),它确实没有音节。它将查找表格,但未找到音节"ㅏ"。

    因此,它会猜到附加到前一个音节的ㅂ(从ㅅ。编辑错字编辑)实际上属于第二个音节。它应该显示"소바"。现在,ㅇ是打字的。然后它试图将attach附加到第二个音节。所以它显示소방。 (此时它也可以在表格中查找방。并且找到它。)

    现在,"ㅊ"输入。可能在内部它可以测试소ㅊㅊ其中o和ㅊ存在于바(我不能写它,因为没有这样的音节o和ㅊ一起存在于바,如밝。)。但是,没有这样的音节。因此,它立即确定ㅊ属于下一个音节。

    然后"ㅏ"输入。它会组装ㅊ和ㅏ来制作차。当您按空格键或返回键或任何其他空格键时,它将完成组合韩文。

    这是一个简单的案例。在韩语中,有更复杂的音节,如빨,꼭,헗等。对于第一个辅音,복자음(BokJaUm,双辅音)喜欢ㅃ,ㄲ在빨和꼭,人们按下shift键键入ㅂ和ㅅ。然后它会显示ㅃ和ㄲ。因此,如果用户键入键盘,那么拾取辅音如何以及确定它所属的位置(前一个音节或下一个音节)可能很容易。 (但是,对于Windows和Xterm,有一些很好的韩语输入法,它允许输入ㅂ两次来制作ㅃ。它是一种智能功能。但是测试像빱빠라빱,흙을等文本可能很复杂,因为你最终会测试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上托管的,但他们被转移到谷歌代码。据我所知," SaeNaRu"和#34; Nabi" (蝴蝶)可以支持两次输入相同的辅音来制作双辅音。

    有关更多详细信息,您可以查找libhangul和nabi。 (我记得之前libhangul和nabi之间的输入法部分代码几乎相同。但当时它们是分开的,并且预计会独立发展。所以,我猜它们是不同的。

    行。第一件事就完成了。

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

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

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

    但是,如果有内存服务,还有另一组字符,这只是韩文辅音和元音的列表。尽管它们看起来与分解的音节看起来相同或类似,但它们实际上是不同的,因为它们被绘制的位置在中间是绘制字符的空间。它的目的是在朝鲜语字母表格中出现韩文字符或类似用于教育目的(或任何其他目的)。

    因此,我不确定将哪些字符(即分解或汉语辅音和元音列表的字符)摄取到您选择或实现的输入法状态机或输入法引擎。如果你实现它,它是你的选择,但是如果你为引擎使用一些外部库,你需要弄明白。

    另外,正如我在博客文章中提到的,每个组合和分解表示中有两个变体,它们都是用Unicode标准定义的。所以,好吧..是啊..我同意。这是相当多的工作。

    至于我,我试图为Mac制作输入法,(当Apple宣布他们将摆脱Finder插件架构以解决安全问题时),但当时libhangul(是的......我试图使用它)正在改变很多。所以,直到它稳定下来,我决定推迟。但是因为当我回到家时工作非常繁忙而且累了,所以我在自己的输入法上没有取得进展。所以,我相信libhangul项目的状态现在比以往任何时候都要好得多。所以,至少要看看它是好的尝试。

    此外,如果您没有Windows,那么尝试hanterm或任何支持Hangul输入的xterm衍生物本身会很好。源代码将在其托管网站上提供。

    祝你的项目好运,如果有更多的事要问我,请这样做。

答案 1 :(得分:2)

查看这些系统级文本输入工具。我从来没有使用过这些,但看起来很有希望。


因为iOS不支持系统范围的键盘自定义,所以每个人都只使用系统默认的输入工具。每个操作系统或平台对Hangul组合的处理都不同。 (MS / Apple / Samsung / LG或其他)因此,最好的方法是使用系统提供的设施(如UITextField)来保证用户的一致性。或者您应该准确地模拟平台操作系统的工作方式。当然你可以自己制作,但用户不会喜欢它。

虽然我不是这个主题的专家 - 韩语韩文合成器 - 但我不认为没有表查找的简单算法。无论如何,如果你真的想自己实现它,这些都是你必须处理的核心问题。

  • 将您的视觉符号合成为以Unicode定义的辅音和元音。
  • 通过放置元音来确定初始辅音/最终辅音。

这不会那么难,但无论如何修改前面字符序列的能力是必需的。您不能仅使用单向流来实现韩语输入,除非您有单独的键用于初始/最终辅音看起来相同

Unicode定义了所有有效的Jamo组件集。通常这些组件太多而无法在设备上呈现。而且效率低下。大多数韩国输入系统再次分解那些Jamo并在合成最终垃圾之前将它们合成一次。您也可以像韩国人一样直观地识别和分解它们。

获得Unicode标准中定义的初始/最终辅音和元音后,Unicode规范化功能(例如-[NSString precomposedStringWithCompatibilityMapping])将执行其余工作。

答案 2 :(得分:2)

libhangul(code.google.com/p/libhangul)进行转换!它有几个功能来处理不同类型的键盘(即具有不同布局的键盘)并将键转换为Hangodes的Unicodes。 它还有几个函数将Hanguls组合成音节(它们基本上实现了Eonil在他的回复中提到的表查找)。

Libhangul在收到它们时将Hanguls存储在缓冲区中(它不输出它们)。收到足够的Hanguls并成功将它们转换为音节后,它会输出音节。不幸的是,这对用户来说非常困惑。解决这个问题的方法是在屏幕上显示缓冲区内容。收到新的韩文后,必须删除已显示的内容。如果已成功形成音节,则显示音节。否则,再次显示缓冲区内容。请注意,您不能只在屏幕上显示新的韩文。您必须擦除之前显示的内容并从缓冲区中读取之前的Hanguls和新的Hanguls并再次显示在屏幕上。 原因是Libhangul可能会更改存储在缓冲区中的先前Hanguls的代码,以便将它们与新的Hangul结合起来。这样,您将获得更新的Hanguls。

另请注意,如果用户更改了光标的位置,则必须清空缓冲区。 此外,如果用户按下退格键,则必须擦除屏幕上显示的最后一个韩文,并且必须从缓冲区中删除。 Libhangul还有一些纠正错别字的功能。例如,如果键入ᅡ和ᄉ,则会将它们转换为사。

感谢JongAm Park和Eonil的帮助和深思熟虑的评论!由于此时我的声誉不到15,我无法提出你的答案,但我会尽我所能。