将韩语单词分割成单个音节 - C++/Python

3
我正在尝试将韩文字符串分割成单个音节。输入是一个字符串,例如“서울특별시”,输出应该是“서”,“울”,“특”,“별”,“시”。我已经尝试使用C++和Python来分割字符串,但结果分别是一系列?或空格(然而字符串本身可以在屏幕上正确打印)。在C++中,我首先将输入字符串初始化为string korean="서울특별시",然后使用string::iterator遍历字符串并打印每个音节。在Python中,我只是简单地使用了一个for循环。
我想知道是否有解决这个问题的方法。谢谢。

3
请查看[《关于Unicode和字符集,每个软件开发人员绝对必须知道的绝对最少知识(无任何借口!)》(The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!))] (http://joelonsoftware.com/articles/unicode.html)。 - Peter Wood
你应该找到一个 Unicode 字符串... - Alex Chamberlain
1
我确定 ICU 提供此功能。(该算法在Unicode 标准附录#29中有描述。) - R. Martinho Fernandes
1个回答

1

我完全不懂韩语,无法对音节划分进行评论,但在Python 2中,以下内容可以正常工作:

# -*- coding: utf-8 -*- 
print(repr(u"서울특별시"))
print(repr(u"서울특별시"[0]))

输出:

u'\uc11c\uc6b8\ud2b9\ubcc4\uc2dc'
u'\uc11c'

在Python 3中,您不需要使用u来表示Unicode字符串。
输出是字符串中字符的Unicode值,这意味着在这种情况下字符串已经被正确地分割。我使用repr打印它们的原因是我使用的终端字体无法表示它们,所以如果没有repr,我只能看到方框。但这纯粹是一个渲染问题,repr证明了数据是正确的。
因此,如果您知道如何逻辑上识别音节,则可以使用repr查看您的代码实际执行了什么操作。Unicode NFC听起来是实际识别它们的好选择(感谢R. Martinho Fernandes),而unicodedata.normalize()是获取它的方法。

只有在输入预先组合的情况下才能正常工作(顺便说一句,使用 U"" 字符串在 C++ 中也可以实现这一点)。例如,U+C11C 也可以用序列 <U+1109 U+1165> 表示,在这种情况下,第一个音节应该是这两个字符,而不仅仅是 U+1109。 - R. Martinho Fernandes
好的,那就是“我不懂韩语”的部分。我的观点是Python在切割Unicode字符的字符串方面没有问题。如何识别韩文音节的逻辑超出了我的知识范围。我想完整的Unicode字形算法可以做到,尽管可能有些过头了。 - Steve Jessop
好的,我只是觉得指出来可能会有价值 :) - R. Martinho Fernandes
@R.MartinhoFernandes:你知道吗,Unicode规范化是否会按要求组合字符,或者在韩语中还有其他要考虑的因素? - Steve Jessop
1
首先,让我说一下,我也不懂韩语,我只是对Unicode有着不健康的喜爱。根据附录29的规定,对于所有格式正确的现代音节,规范化形式C会使每个音节成为一个单独的字符,因此这可能是一个可行的选项。 - R. Martinho Fernandes
虽然我推荐ICU在C++中处理相同的事情,但我的库可以处理这个简单的任务 :) 不过,不要在真实代码中使用它。 - R. Martinho Fernandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接