显示韩文字符 – iOS应用程序

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

我明白,连字母(Jamo)有一些规则。

是否有自动将所有这些规则应用于字母串的函数,还是需要编写代码进行更改(例如,如果前面有元音,则将辅音改成尾巴辅音)?

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

通过阅读你和人在这里写的全文,我发现你正在制作一个韩国的手写识别软件。 所以,你不会喜欢苹果提供的韩文input法的奢华。

有两件事我可以说。 我们一个接一个去。 (我相信你已经意识到我要解释的两件事情之一。)

  1. 如何撰写韩文文字。

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

假设你写소방차(一个Fire部门的汽车)。你应该写:Againㅗㅂㅏㅇㅊㅏ(我不是在谈Unicode的分解forms,而是人们如何写韩文文本)。

当您暂时键入ㅗ(第二个字符)时,显示系统会将attaching附加到其上一个displays上来显示。 它会查找韩国表。 (虽然如何组合韩文是JoHap风格(조합형),也就是所谓的复合风格,但是在任何韩语标准中定义的韩语文字都是以Wansung风格(완성형)定义的,因此,您需要testing“汇编”音节看表是否有这样的音节)。 然后你会在表格中find“소”。 所以,你会显示“소”。

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

所以,猜测前一个音节附带的ㅂ(从错误编辑)实际上属于第二个音节。 它应该显示“소바”。 现在,键入。 然后它试图将ㅇ附加到第二个音节。 所以它显示소방。 (此时也可以在桌面查找방,并find它。)

现在,“ㅊ”键入。 可能在内部它可以testingㅊㅊㅊㅊㅊㅊㅊㅊㅊ(I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I 但是,没有这样的音节。 因此,它立即确定ㅊ属于下一个音节。

然后input“ㅏ”。 它会组装ㅊ和ㅏ来制造차。 当您按空格键或返回键或任何其他空格键时,它将完成撰写韩文。

这是一个简单的例子。 在韩语中,有更复杂的音节,如빨,꼭,헗等。对于第一个辅音,빨자음(BokJaUm,Double Consonants)如ㅃ,ㄲ在빨和꼭中,人们按shift和ㅅ按shift键。 然后它会显示ㅃ和ㄲ。 因此,如果用户使用键盘inputtypes,那么拾取辅音以及确定它所属的哪个(前一个音节或下一个音节)可以是容易的。 (但是,对于Windows和Xterm,有一些很好的韩文input法,在这种input法中,允许键入两次to,这是一种智能function,但是testing像빱빠빱빱这样的文本可能会很复杂,因为您最终会testing3或4个辅音,如{1,3},{2,2},{3,1}。

坏消息是…因为你正在写手写识别,所以如果你把韩文字符逐个input到韩文input法引擎中,你可能需要处理这种复杂的情况。 但是,如果在应用程序中编写自己的input法,则可以维护自己的状态机,因此可以更容易。 但是,正如你所看到的,这是一个折衷。 取决于现有的input法引擎并将每个字符input到它中。 (嗯…等等…也许input法引擎也可以处理这些复杂的情况。)

仅供参考,我想介绍两个开源项目。 一个是Mac的韩文input法Finder模块 ,另一个是input法引擎 ,你可以用它来制作韩文input法。 此外,这里还有一个用于X-Windows的韩文input法。 如果你喜欢Windows项目查找, 这里是一个 。

后两者是在韩国开源项目托pipe网站KLDP.net上托pipe的,但是他们被转移到Google代码。 据我所知,“SaeNaRu”和“Nabi”(蝴蝶)可以支持两次input相同的辅音,形成双辅音。

有关更详细的信息,你可以查阅libhangul和nabi。 (我记得之前libhangul和nabi之间的代码input法部分几乎是一样的,但是那时候它们是分开的,有望独立进化,所以我猜想它们是不一样的。

好。 第一件事就完成了。

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

这是关于什么字符select作为您的可能的韩国input法状态机或像libhangul引擎的input。 基本上有两个组成(显示)韩文字符的表示:组合和分解。 组成一个包含完整的字符。 例如,사랑합니다,每个音节,사,랑,합,니,다被保存。 它们不被存储为ㅅ,ㅏ,ㄹ,ㅏ,ㅇ,ㅎ,ㅏ,ㅂ,ㄴ,ㅣ,ㄷ,ㅏ。 这是用Unicode编写的。 这种表示通常被文本编辑器等使用。另一种表示是以Unicode分解的。 这就像ㅅ,ㅏ,ㄹ,ㅏ,ㅇ,ㅎ,ㅏ,ㅂ,ㄴ,ㅣ,ㄷ,ㅏ。

这种表示通常由文件系统使用。 例如,如果您在Windows上使用Hangul文件名,并从Mac访问包含该文件的文件夹,则它将显示为“ㅅㅏㄹㅏㅇㅎㅏㅂㄴㅣㄷㅏ”,尽pipe它在Windows上显示为“랑합다다”。

然而,如果内存服务,还有另外一组字符,这只是一个韩文辅音和元音列表。 虽然它们看起来可能与分解的音节相同或相似,但它们实际上是不同的,因为它们被绘制的位置在绘制字符的空间的中间。 它的目的是为了在韩文字母表或类似的教育目的(或任何其他目的)的东西呈现韩文字符。

所以,我不知道你select或实现的input法状态机或input法引擎是什么字符(即分解的或者汉字辅音和元音列表的字符)。 如果你实现它,那么你的select,但如果你使用一些外部库的引擎,你需要弄清楚。

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

至于我,我试图为Mac做一个input法,(当苹果宣布他们将摆脱Finder插件架构的安全问题),但当时libhangul(是的,我试图使用它)正在改变很多。 所以,直到稳定下来,我决定坚持下去。 但是因为工作很忙,回到家的时候很累,所以没有用自己的input法进步。 所以,我相信libhangul项目现在比以前好多了。 所以,至less要看看它。

此外,如果您没有Windows,那么尝试使用hanterm或任何支持Hangulinput的xterm衍生产品本身就不错。 源代码将在他们的托pipe网站上提供。

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

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


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

虽然我不是这方面的专家 – 韩国的韩文合成者 – ,但我不认为没有查表就没有简单的algorithm。 无论如何,如果你真的想自己实现,这些都是你必须处理的核心问题。

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

它不会那么难,但无论如何修改前面的字符序列的能力是必需的 。 你不能只用单向stream实现韩文input,除非你看起来相同的初始/最后一个辅音有单独的键。

Unicode定义了所有有效的Jamo组件。 通常这些组件太多,不能在设备上呈现。 而且效率也不高。 大多数韩国input系统再次分解这些Jamo并在合成最后的垃圾之前合成它们一次。 就像韩国人一样,你也可以识别和分解它们。

在获得Unicode标准中定义的初始/最后一个辅音和元音之后,Unicode标准化function(例如-[NSString precomposedStringWithCompatibilityMapping] )将完成剩余的作业。

libhangul(code.google.com/p/libhangul)进行转换! 它具有处理不同types的键盘(即具有不同布局的键盘)并将键转换成汉王的Unicodes的几个function。 它还有几个function,结合汉王语制造音节(他们基本上实现了Eonil在他的回应中提到的表格查询)。

Libhangul在接收它们时将Hangul存储在缓冲区中(它不输出它们)。 在收到足够的汉王语并成功地将它们转换成音节之后,输出该音节。 不幸的是,这对用户来说是相当混乱的。 解决方法是在屏幕上显示缓冲区内容。 收到新的韩文后,必须删除显示的内容。 如果一个音节被成功的形成,那么音节就会显示出来。 否则,将再次显示缓冲区内容。 请注意,您不能只在屏幕上显示新的Hangul。 您必须清除之前显示的内容,并从缓冲区中读取以前的汉王和新汉王,并再次将其显示在屏幕上。 原因是Libhangul可能会修改之前存储在缓冲区中的Hanguss的代码,以便将它们与新的Hangul结合起来。 这样,你会得到更新的汉王。

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

谢谢JongAm Park和Eonil的帮助和深思熟虑的评论! 由于我的名声在这个时候还不到15,所以我不能满足你的答案,但是我会尽我所能。