c# - 检测日文字符输入和 "Romajis"(ASCII)

标签 c# unicode char ascii non-ascii-characters

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

  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 字符集的语言。

最佳答案

Wikipedia 很不错,右上角有平假名、片假名和汉字的 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);

请注意,这应该和你的一样快,只是我觉得更好/更好 :)

确定通用语言集

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

还有一个事实是日本人相当多地使用英语(和标点符号),您的方法会将任何包含罗马化单词或表情符号的内容视为罗马字。

关于c# - 检测日文字符输入和 "Romajis"(ASCII),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15805859/

相关文章:

c# - 窗口最大化时获取非最大化窗口位置/大小

c - 为什么 C99 对通用字符名称有如此奇怪的限制?

c - 使用 printf 打印 UTF-8 字符串 - 宽字符串文字与多字节字符串文字

c++ - 从文件中解析二进制数据

c++ - 示例程序崩溃

c# - 将字符串作为参数从 C# 传递到 C++ 中的回调函数

c# - 合并数据表但忽略重复的行

c# - 如何创建 resx 文件

C编程: How to program for Unicode?

c - 我的 sscanf 如果陷入无限循环,我该如何修复它