Как проверить, строчные ли арабские / персидские символы? - PullRequest
0 голосов
/ 11 июня 2019

Понятие строчные / заглавные буквы немного отличается в английском и некоторых языках RTL, таких как арабский / персидский, я хочу проверить, является ли персидский / арабский символ большой или маленькой буквой.

Я пробовал метод char.IsLower, но он не работает для языков RTL.

Пожалуйста, посмотрите следующий фрагмент кода:

             string mainString = "مرحبا";
             char[] arr = mainString.ToCharArray();
             bool Lcase= char.IsLower(arr[3]);

Я хочу знать, является ли четвертая буква (справа) маленькой или большой? Но Lcase всегда становится ложным, в то время как это должно быть правдой.

Я не могу даже получить маленькую букву на этих языках, потому что arr[3].ToString() всегда получает заглавные буквы ("ب").

please look at this image

Ответы [ 5 ]

1 голос
/ 11 июня 2019

Сначала вам нужно изменить форму строки. Изменение формы означает преобразование текстовых символов в его глиф, например:

ﺴ ﻼ ﻡ ﻋ ﻠ ﻴ ﻜ ﻢ

Затем создайте сопоставление для букв и сравните их, чтобы понять, что это за символ.Существуют некоторые библиотеки, такие как iTextPDF , которые имеют класс ArabicLigaturizer, который позволяет вам изменять ваши арабские / персидские строки.

Чтобы создать отображение, вы можете получить помощь из этих библиотек:

  1. python-arabic-reshaper
  2. js-arabic-reshpaer
  3. Изменить арабские буквы для дизайнеров

Я даже использовал код для кода .net для изменения формы одного из моих бесплатных инструментов здесь: github .

0 голосов
/ 11 июня 2019

Ура !!!

Я сам придумал!простое решение этого.:)

мое решение:

Если следующая буква не существует или она пустая / пробел, буква большая, в противном случае это маленький / средний символ.

Кажется, это работает.

ОБНОВЛЕНИЕ: К сожалению, это решение работает только для персидского языка и не работает для всех случаев арабского языка.Поэтому я принял ответ Али Бахрами.

0 голосов
/ 11 июня 2019

В арабском языке нет ничего, что называется верхним или нижним регистром, это всего лишь один случай, я думаю, что метод IsLower внутренне использует регулярное выражение, что-то вроде сопоставления его с [AZ] регулярным выражением, поэтому обычно всегда имеет значение false

0 голосов
/ 11 июня 2019

Мне интересно, возможно ли это?Даже если я введу прописные или строчные буквы, у меня будет один и тот же код ASCII.

    TextInfo myTI = new CultureInfo("ar-DZ",false).TextInfo;

    string mainString = "مرحبا";
    char[] arr = mainString.ToCharArray();

    Console.WriteLine((int)myTI.ToLower(arr[3]));

    Console.WriteLine(char.IsLower(myTI.ToLower(arr[3])));

    Console.WriteLine((int)myTI.ToUpper(arr[3]));

    Console.WriteLine(char.IsLower(myTI.ToUpper(arr[3])));

    string word = "word";
    arr = word.ToCharArray();           
    Console.WriteLine((int)arr[3]);     

    Console.WriteLine(char.IsLower(arr[3]));

    word = "WORD";
    arr = word.ToCharArray();                  
    Console.WriteLine((int)arr[3]); 

    Console.WriteLine(char.IsLower(arr[3]));

Ожидаемый результат

1576

False

1576

False

100

True

68

False

0 голосов
/ 11 июня 2019

Попробуйте это, что должно обратить LTR к RTL:

string mainString = "مرحبا";
char[] arr = mainString.Reverse().ToArray();
bool Lcase= char.IsLower(arr[3]);

Тем не менее, как отметил @Martin в комментарии, арабский (и ни один из персидских алфавитов) не имеет заглавных букв, поэтому значениеLcase всегда будет false, если mainString содержит только арабский / персидский.Этот код выше все равно будет работать, если вы хотите использовать RTL и проверить наличие заглавных букв, возможно, в тексте, который содержит текст в западном алфавите, например, название какой-либо компании или продукта, или даже URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...