UTF8单词包含混合的日语和英语字符。如何确定哪些字符是日语,哪些是英语?

7

我有一个UTF8编码的字符串,其中包含日文和罗马字符。 我想识别哪些是日文字符,哪些是罗马字符?如何鉴别?


也许可以用正则表达式:[a-zA-Z] - Oliver
2
顺便提一下,有一个需要处理的奇怪问题,那就是全角罗马字符。你必须决定是将它们视为日语还是罗马语,这可能取决于目的是什么。例如,如果目的是确定文本是否主要使用日语,您应该将它们视为罗马字符。如果目的是确定字符串是否可以使用仅拉丁字体打印,它们就是日语(尽管它们可以映射到它们的“正常”等效项)。 - Steve Jessop
4个回答

7
您正在寻找Unicode的“Script”属性。我推荐使用ICU库。
来自:http://icu-project.org/apiref/icu4c/uscript_8h.html
UScriptCode     uscript_getScript (UChar32 codepoint, UErrorCode *err)
Gets the script code associated with the given codepoint. 

结果将告诉您字符的脚本。以下是可能返回的常量之一:
  • USCRIPT_JAPANESE(不确定此类别中包含什么...)
  • USCRIPT_HIRAGANA(日语假名)
  • USCRIPT_KATAKANA(日语片假名)
  • USCRIPT_HAN(日语汉字)
  • USCRIPT_LATIN
  • USCRIPT_COMMON(所有脚本都共同使用的空格和标点符号)
LibICU可用于Java、C和C++。您需要解析Unicode代码点才能使用该函数。 替代方案:您还可以使用Unicode正则表达式,尽管很少有引擎支持此语法(Perl支持...)。这个PCRE将匹配文本字符串,肯定是日语,但不会获取所有内容。
/\p{Katakana,Hiragana,Han}+/

当你解析这些东西时,要小心,因为日文文本中经常包含罗马字或数字。查看ja.wikipedia.org网站可以快速确认这一点。


6

2
Unicode代码图表中,日语字符可以是平假名、片假名和汉字。这些字符集有定义的起始和结束位置,因此您可以创建一个函数来检查字符是否在这些限制范围内。
bool isJapanese(wchar_t w)
{
   // Hiragana...
   if (w >= 0x3041 && w <= 0x309F)
      return true;
   // Do the same for the other sets
   ...
   return false; 
}

同样地,您可以实现一个isRoman函数...

一个UTF-8编码的字符串不使用宽字符类型。而且UTF-8编码比仅仅比较一个值更加复杂... - Adrien Plisson
我假设他已经将他的UTF8字符串转换为了wstring。http://utfcpp.sourceforge.net/支持该转换。 - pnezis
你不应该“假设”他做了什么,因为他并没有说他这样做了。然而,你指向utfcpp库对于这个线程非常有意义。 - Adrien Plisson

1

如果您不关心准确性,只需检查每个UTF-8序列的第一个字节:如果序列长度<=2(即第一个字节<=0xDF),则假定为罗马字符,否则为日语。

就我个人而言,我可能会使用Perl


此外,值得一提的是,查看Unicode定义并确定日语字符所在的范围也是很有必要的。这样区分日语和英语字符就不难,并且准确无误。 - Adrien Plisson
@Adrien:如果你只关心拉丁文和各种日语书写系统,按序列长度划分是准确的;然而,其他块也会被错误地识别为拉丁文(例如阿拉伯文)或日语(例如韩文字母) ,因为我们基本上只是在0x07FF(编码为2字节序列的最大代码点)处分割码点范围。 - Christoph
好主意,只有两件事情需要确保。拉丁文本不应包含LATIN EXTENDED ADDITIONAL范围(U+1E00-U1EFF)的字符,也不应包含一般的标点符号(U+2000-U+206F),引号、破折号和连字符并不罕见。 - Patrick Schlüter

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