4

我希望能够检测到用户何时:

  1. 输入日文字符(汉字或假名)
  2. 输入罗马字符(专有)

目前我正在使用这样的 ASCII 范围(C# 语法):

string searchKeyWord = Console.ReadLine();
var romajis = from c in searchKeyWord where c >= ' ' && c <= '~' select c;

if (romajis.Any())
{
    // Romajis
}
else
{
    // Japanese input
}

有没有更好、更快(更强...)的方法来做到这一点?

编辑:这个问题可以推广到任何其他具有非 ascii 字符集的语言。

4

1 回答 1

7

维基百科很好,右上角有平假名、片假名和汉字的 unicode 范围。我们可以利用它来优化您的算法并获得其他字符集。

private static IEnumerable<char> GetCharsInRange(string text, int min, int max)
{
    return text.Where(e => e >= min && e <= max);
}

用法:

var romaji = GetCharsInRange(searchKeyword, 0x0020, 0x007E);
var hiragana = GetCharsInRange(searchKeyword, 0x3040, 0x309F);
var katakana = GetCharsInRange(searchKeyword, 0x30A0, 0x30FF);
var kanji = GetCharsInRange(searchKeyword, 0x4E00, 0x9FBF);

请注意,这应该和您的一样快,只是更好/更好 imo :)

确定通用语言集

是的,您可以检测到这样的字符集,但不是真正的语言。由于法语、德语等与英语共享很多字符,而日语与中文共享很多汉字(显然)。如果没有巨大的查找图表,您无法清楚地说单个字符来自单一语言的大量字符。

还有一个事实是日本人使用英语(和标点符号)相当多,你的方法会认为任何包含罗马字或表情符号的东西都是罗马字。

于 2013-04-04T09:10:30.253 回答