在字符串中测试日文/中文字符

7

我有一个程序可以读取大量文本并进行分析。这些文本可能是任何语言,但我需要特别测试日语和中文以便以不同的方式进行分析。

我了解到可以通过测试每个字符的Unicode编号来确定它是否在CJK字符范围内。这很有帮助,但如果可能的话,我想将它们分开以便对不同的词典进行处理。有没有一种方法可以测试一个字符是日语还是中文?


1
你知道代码集,还是也需要猜测? - Jonathan Leffler
如果你不知道代码集,那么与其把一切都放在Unicode中,实际上不知道代码集可能会让你的生活更轻松。 - Elijah
我最终将所有内容转换为Unicode进行分析(我确实被迫这样做)。我可以在转换之前检测代码集;这个问题更多是关于代码集是否已经是Unicode。 - landyman
作为这个问题的补充,如果您需要检测一个字符是中文还是日文,该怎么办呢?不管是哪种语言的字符都可以。我目前正在尝试匹配 \p{Han}\p{Hiragana}\p{Katakana} 中的任何内容,但以下字符无法匹配:发同讲说宅电的手机告的世全所回广讲说跟 - yarian
6个回答

6
由于Unicode标准中的统一码点的实现方式,你无法测试单个字符以确定它是日语还是中文。基本上,每个汉字都有可能是日语汉字,但反之则不然。此外,还有许多约定可用于测试文本块是否为其中一种语言。
  1. 简化字- 如果您要测试的字符是中国大陆简化字,例如门,则仅适用于中国大陆中文。
  2. 假名- 如果该字符是许多日语假名字符之一,例如あいうえお,则您正在处理的文本块肯定是日语。
问题在于共同使用的字符和单词数量太多。然而,如果我需要快速解决这个问题,我会检查整个文本块中是否包含假名-如果文本包含假名,则我知道它是日语。如果您还需要区分韩语,我会测试韩文字母。此外,如果您需要区分哪种类型的中文,测试简化类型将是最好的方法。

谢谢。我知道一些字符是共享的,但我没有意识到假名符号不是中文的一部分。我已经为它们做了一个测试,目前看起来可以工作。在进行更多测试后,我们将看到它的准确性如何。再次感谢。 - landyman
简体中文通常不会出现在日语汉字中。为了区分这两者,可以解析字符串以查找假名(平假名和片假名),它们是日语特有的字符。 - Michael

2
开发Unicode的过程包括汉字统一。这是因为许多日文字和韩文字都源于或与汉字相同;同样也适用于韩文。有一些(片假名和平假名 - 参见Unicode标准v5.1.0的第12章)在日语中常用的字符会表明文本是日语而不是中文,但我认为这可能只是一个统计测试而不是决定性的。

请查看O'Reilly关于CJKV信息处理的书籍(CJKV代表中文、日文、韩文、越南文;我有其前身的CJK版本)。还有一本关于Unicode解释的O'Reilly书籍,虽然可能对这个问题没有太大帮助(我不记得讨论如何识别日文和中文文本)。


谢谢。我一定会查看这些书。我同意仅测试日语(平假名和片假名)并不是最终的解决方案,但现在它可以使用。 - landyman

1
你可能无法可靠地做到这一点。日语使用了许多与中文相同的字符。我认为你能做的最好的事情就是查看一段文本。如果你看到任何独特的日语字符,那么你可以假设整个块是日语。如果没有,那么它很可能是中文。
然而,我只是在学习中文,所以并不是专家。

0

有许多字符只在日语中使用或只在中文中使用。

日本和中国都简化了许多字符,但通常采用不同的方式。您可以查看日本新字体和简体中文字符。后者比前者更多。如果两者都没有,则可能是繁体中文。

当然,如果您处理Unicode文本,您可能会发现偶尔出现罕见字符或混合语言,这可能会扰乱启发式,因此最好计算字符类型以作出判断。

找出哪些字符在一种语言中常见而在其他语言中不常见的好方法是将旧编码相互比较。您可以在互联网上轻松找到每个映射到Unicode的映射。

我曾经写过一些代码,通过代码点进行二进制搜索,即使在JavaScript中也非常快-虽然我可能在旅途中丢失了它(-:


0
一个解决方法是在转换为 Unicode 之前检查编码。

0

测试片假名或平假名范围内的字符应该是一种非常可靠的方法来确定文本是否为日语,特别是当您处理“常规”的用户生成文本时。如果您正在查看法律文件或其他更正式的内容,则可能会稍微困难一些,因为那里将有更多复杂的汉字 - 但它仍然应该是相当可靠的。


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