UTF8单词包含混合的日语和英语字符。如何识别哪个字符是日语,哪个是英语?

时间:2011-11-17 11:09:26

标签: java c++ c

我有一个UTF8编码的字符串,其中包含日语和罗马字符。 我想确定哪些字符是日文字符,哪些字符是罗马字符?怎么识别?

4 个答案:

答案 0 :(得分:7)

您正在寻找Unicode“脚本”属性。我推荐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会很快证实这一点。

答案 1 :(得分:6)

您可以使用category在Java中确定Unicode Character.getType()。对于日语,它将是Lo,对于拉丁字符Ll,Lu。

答案 2 :(得分:2)

Unicode code charts,日文字符可以是平假名,片假名和表意文字。这些集合定义了开始和结束位置,因此您可以创建一个函数来检查字符是否在这些限制范围内。

bool isJapanese(wchar_t w)
{
   // Hiragana...
   if (w >= 0x3041 && w <= 0x309F)
      return true;
   // Do the same for the other sets
   ...
   return false; 
}

同样,您可以实现isRoman功能......

答案 3 :(得分:1)

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

就个人而言,我可能只是use Perl