4

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

我知道连接字母有一些规则(Jamo)。

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

4

3 回答 3

7

FCA。是你给我发邮件的吧?因为这里有更详细的问题,所以我会尽量(尽我所能)在这里回答,而不是回复您的电子邮件。

通过阅读你和人们在这里写的全文,我发现你正在制作一个韩文手写识别软件。因此,您不会享受 Apple 提供的韩语输入法的奢华。

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

  1. 如何撰写韩文文本。

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

假设你写소방차(消防部门的汽车。)你要写:ㅅㅗㅂㅏㅇㅊㅏ(我又不是在谈论 Unicode 的分解形式。这是关于人们如何写韩文文本。)

当您临时键入ㅗ(即第二个字符)时,显示系统会通过将ㅗ附加到其前面的ㅅ来显示소。它会查找韩国表。(虽然韩文的组装方法是 JoHap 样式(조합형),称为复合样式,但在任何韩国标准中都定义了允许的韩文文本表,称为万星样式(완성형)。因此,您要测试“组装”音节以表看有没有这样的音节)。然后你会在表格中找到“소”。因此,您将显示“소”。

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

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

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

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

这是一个简单的案例。在韩语中,有更复杂的音节,如빨、꼭、헗等。对于第一个辅音,복자음(BokJaUm,双辅音),如빨和꼭中的ㅃ、ㄲ,人们按shift键输入ㅂ和ㅅ。然后会显示ㅃ和ㄲ。因此,如果用户使用键盘键入,则可以很容易地找出辅音并确定它所属的位置(前一个音节或下一个音节)。(不过,有一些适用于 Windows 和 Xterm 的不错的韩语输入法,它允许输入 ㅂ 两次以生成 ㅃ。这是一种智能功能。但是测试像 빱빠라빱、흙을 这样的文本可能会很复杂,因为您最终会测试3 或 4 个辅音,如 {1,3}、{2,2}、{3, 1}。

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

仅供参考,我想介绍两个开源项目。一个是Mac 的韩语输入法查找器模块,另一个是输入法引擎,您可以使用它制作韩语输入法。此外,这里还有一个用于 X-Windows 的韩语输入法。如果您更喜欢查找 Windows 项目,这里有一个.

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

有关更多详细信息,您可以查找 libhangul 和 nabi。(我记得之前libhangul和nabi的输入法部分代码几乎是一样的。但是当时他们是分开的,期望独立进化。所以,我猜他们是不同的。

好的。第一件事就完成了。

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

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

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

但是,如果没记错的话,还有另一组字符,它只是韩文辅音和元音的列表。尽管它们可能看起来与分解的音节相同或相似,但它们实际上是不同的,因为它们的绘制位置位于字符绘制的中间空间。它的目的是为了教育目的(或任何其他目的)在韩语字母表或类似的东西中显示韩文字符。

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

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

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

此外,如果您没有 Windows,最好尝试 hanterm 或任何本身支持韩文输入的 xterm 衍生产品。源代码将在他们的托管网站上提供。

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

于 2012-10-23T16:20:56.173 回答
2

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


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

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

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

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

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

在您获得 Unicode 标准中定义的声母/韵母和元音后,Unicode 规范化功能(例如-[NSString precomposedStringWithCompatibilityMapping])将完成其余工作。

于 2012-10-22T19:40:20.280 回答
2

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

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

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

感谢 JongAm Park 和 Eonil 的帮助和深思熟虑的评论!由于此时我的声誉低于 15,因此我无法投票赞成您的答案,但我会尽可能地投票。

于 2012-11-23T03:01:18.677 回答