Анализ текста на арабском / RTL слева направо

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

string s = "Test:لطيفة;اليوم;a;b"

Обратите внимание, что в строке есть точки с запятой. Когда я использую команду Split, например string[] spl = s.Split(';'); , то некоторые из строк сохраняются в обратном порядке. Вот что происходит:

Spl [0] = “Тест: لطيفة”
spl [1] = “” اليوم
spl [2] = “a”
spl [3] = “b”

Вышеуказанное не соответствует порядку по сравнению с оригиналом. Вместо этого я ожидаю получить следующее:

Spl [0] = “Тест: اليوم”
spl [1] = “لطيفة”
spl [2] = “a”
spl [3] = “b”

Я готов написать свою собственную функцию разделения. Тем не менее, символы в строке также анализируются в обратном порядке, поэтому я вернусь к квадрату. Я просто хочу пройти через каждого персонажа, как показано на экране.

Поскольку ваша строка в настоящее время стоит, слово لطيفة сохраняется до слова اليوم; тот факт, что اليوم отображается «первым» (то есть слева), является просто (правильным) результатом двунаправленного алгоритма Unicode при отображении текста.

То есть: строка, с которой вы начинаете («Test: لطيفة; اليوم; a; b»), является результатом ввода пользователем «Test:», затем لطيفة, затем «;», затем «اليوم», а затем «; a; б». Таким образом, способ разделения C # на самом деле отражает способ создания строки. Это просто, что способ, которым он создан, не отображается в отображении строки, потому что два последовательных арабских слова рассматриваются как единое целое при их отображении.

Если вы хотите, чтобы строка отображала арабские слова в порядке слева направо с точками с запятой между ними, одновременно сохраняя слова в том же порядке, тогда вы должны поместить знак слева направо (U + 200E) после точка с запятой. Это эффективно отделяет каждое арабское слово как свое собственное подразделение, а двунаправленный алгоритм будет обрабатывать каждое слово отдельно.

Например, следующий код начинается со строки, идентичной той, которую вы используете (с добавлением одной метки слева направо), но она будет разделять ее в соответствии с тем, как вы ее ожидаете (т.е. , spl [0] = “Test: اليوم” и spl [1] = “لطيفة”):

 static void Main(string[] args) { string s = "Test:اليوم;\u200Eلطيفة;a;b"; string[] spl = s.Split(';'); } 

Вы также можете использовать библиотеку Uniscribe для Microsoft. Метод ScriptItemize даст вам кластеры символов, их начальный индекс в исходной строке и порядок RTL. Используя эту информацию, вы можете найти последовательные кластеры, которые содержат только арабский язык. Разделение их по отношению к ‘;’ и обратное направление даст вам то, что вам нужно.

Строки не меняются, а фактически раскладываются в правильном порядке. Языки RTL – RTL при отображении, но в памяти они сохраняются «слева направо», как и английский. Я попытаюсь продемонстрировать, что немного сложно, так как у меня нет установленной арабской клавиатуры.

Ваша строка s = "Arbi/Arbi, Alarbia" . s [0] – A (арабский A’in), s [1] – R и т. д. s [4] есть /, а s [9] -. Поэтому при расщеплении вы получаете s [0: 8] в первой части и s [10:] во втором.

Это правильный способ обработки строк RTL. Если вы хотите обратное, вам нужно полностью изменить массив.

Имейте в виду, что переключение между RTL и LTR является одной из самых неприятных задач. Вы не представляете, сколько времени вы потратите на выяснение того, что делать с числами или английскими словами внутри строк RTL. Лучшее, что вы можете сделать, это вообще избежать проблемы и просто попытаться заставить Excel показать строки как RTL.

Похоже, что (согласно Reflector) Split внутренне использует Substring и использует внутреннюю функцию, которая просто копирует буквы слева направо без какого-либо изучения культуры. Из-за этого я не вижу никакого способа обойти массив, который возвращает Split .

  • Почему исключение «#include » только иногда приводит к сбоям компиляции?
  • Извлечь числовую часть строк смешанных чисел и символов в R
  • java.lang.NumberFormatException: пустая строка
  • В чем разница между .Equals и ==
  • Где живут строковые литералы Java и .NET?
  • Как извлечь числа из строки и получить массив ints?
  • Простой способ удалить несколько пробелов в строке?
  • Как создать случайную строку фиксированной длины в Go?
  • Как использовать переменные в одиночных кавычках?
  • Parse Date from String в этом формате: dd / MM / yyyy
  • Функция strrev () недоступна в Linux?
  • Давайте будем гением компьютера.