Как проверить файл на Китайский текст
У меня есть файл test.txt в котором присутствует текст: 㐨�ᵪ勿魉➈䚂ィ聂⑽₅硪▒地䰗倓쾄绻唔㯔옅꼴塟䂕蓘篛i
Мне нужно проверить если в файле начало строки начинается не с Русских букв или Английских и конец, то вернуть false, если присутствует то true
Проверку делаю так, но как правильно реализовать?
public static bool CheckChina()
{
string fullfilepath = Path.Combine(desktopath, "11.txt");
if (!fullfilepath.Contains("䚂ィ")) // Текст Китайский разный ( может не совпадать )
{
return false;
}
return true;
}
Ответы (2 шт):
Указать диапазон(ы) и сверять символы по ASCII.
public static bool CheckChina()
{
string fullfilepath = Path.Combine(desktopath, "11.txt");
foreach(char c in fullfilepath)
for (int i = 19966; i < 21007; ++i)
(int)c == i ? return true : continue;
return false;
} // Возможно не работает, давно не писал на шарпах
Начнём с того, что в китайском языке сам чёрт ногу сломит. Его символы не расположены в одном диапазоне.
https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
https://stackoverflow.com/a/1366113/5045688
Соответственно, проверять нужно во всех этих диапазонах.
Более того, код одного из символов, которые вы привели в вопросе - 䚂 - равен FF68. И он, насколько я могу судить, не входит ни в один из этих диапазонов. В то же время google translator определяет его как китайский. В общем, разбирайтесь сами.
Вот так можно сделать проверку по нескольким диапазонам. Тут несколько проходов по строке, но оставлю так ради понятности.
public static bool ContainsChinese(string text)
{
return
text.Any(c => c >= '\u4E00' && c <= '\u9FFF') ||
text.Any(c => c >= '\u3400' && c <= '\u4DBF') ||
text.Any(c => c >= '\uF900' && c <= '\uFAFF');
}
Есть диапазоны, которые в кодировке UTF-16 (это внутреннее представление строк в .NET) будут состоять из суррогатных пар. Например, 20000-215FF. Для работы с ними, видимо придётся использовать класс StringInfo.
Console.WriteLine(ContainsChinese("㐨�ᵪ勿魉➈䚂ィ聂⑽₅硪▒地䰗倓쾄绻唔㯔옅꼴塟䂕蓘篛i")); //True
Другой вариант - используем регулярки.
Supported named blocks - здесь перечислены именованные блоки, которые можно использовать в регулярных выражениях. Например, так:
private static readonly Regex cjkRegex = new Regex(
@"\p{IsCJKUnifiedIdeographs}|\p{IsCJKCompatibilityIdeographs}|\p{IsCJKCompatibilityForms}",
RegexOptions.Compiled);
public static bool ContainsChinese(string text)
{
return cjkRegex.IsMatch(text);
}
В шаблоне я указал три блока. Перечисляются они через знак |. По идее, туда нужно добавить все, содержащие в названии CJK. Выберите нужные вам диапазоны.
Console.WriteLine(ContainsChinese("㐨�ᵪ勿魉➈䚂ィ聂⑽₅硪▒地䰗倓쾄绻唔㯔옅꼴塟䂕蓘篛i")); //True