Как разделение JavaScript работает с арабскими и английскими строками? - PullRequest
22 голосов
/ 24 сентября 2019

Когда я попытался разделить:

"بحد-8635".split('-')

, тогда JavaScript дает мне такой результат:

[0] - بحد,
[1] - 8635

console.log("بحد-8635".split('-'))

И когда я попытался разделить:

"2132-سسس".split('-')

, это дает мне другой результат:

[0] - 2132
[1] - سسس

console.log("2132-سسس".split('-'))

Как это происходит?Как это можно правильно реализовать?

Ответы [ 4 ]

13 голосов
/ 24 сентября 2019

Это зависит от того, как вы печатаете строку (слева направо / справа налево).В указанном вопросе «2132-سسس» было напечатано слева направо, а «8635-بحد» - справа налево.

Проверьте приведенный ниже фрагмент.

console.log("Typed left to right:");
console.log("2132-سسس".split('-'));
console.log("8635-بحد".split('-'));

console.log("---------------");

console.log("Typed right to left as Arabians follow:");
console.log("سسس-2132".split('-'));
console.log("بحد-8635".split('-'));
3 голосов
/ 24 сентября 2019

Вместо того, чтобы рассматривать направление текста как проблему, которая должна контролироваться на уровне разметки или форматирования, Unicode требует, чтобы он обрабатывался на уровне набора символов.При отсутствии символов форматирования, которые бы указывали направление текста, некоторые символы (например, буквы латинского алфавита) отображаются слева направо, некоторые (например, буквы арабского или иврита) отображаются справа налево, а некоторые (например, знаки препинания)могут отображаться способами, которые зависят от предыдущих символов, а некоторые (например, цифры) могут отображаться слева направо в виде группы, но с отображением групп в соответствии с направлением предыдущего текста.

Еслизаглавные буквы в тексте (символы, указанные по порядку, слева направо) abc123 456XYZdef были в алфавите справа налево, текст будет отображаться как abc123 456ZYXdef, а символы справа налево отображаются в видепорядок справа налево.Если бы порядок символов был (опять же, чтение строго слева направо) был abcXYZ456 123def, он был бы отображен как abc123 456ZYXdef, потому что две группы чисел были бы отображены в порядке справа налево, слевапредыдущего текста справа налево, даже если числа в каждой группе будут читаться слева направо.

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

1 голос
/ 24 сентября 2019

Это зависит от того, как набрана ваша строка (ltr or rtl).

Чтобы понять разницу, установите атрибут dir на входе, а затем разделите значение:

function handleLTR() {
  let element = document.getElementById('default').value
  console.log(element.split('-'))
}

function handleRTL() {
  let element = document.getElementById('rtl').value
  console.log(element.split('-'))
}
<div>
  <input id='default' value=''></input>
  <button onClick=handleLTR()>Handle LTR</button>
</div>
<div>
  <input id='rtl' dir="rtl" value=''></input>
  <button onClick=handleRTL()>Handle RTL</button>
</div>

Подробнее читайте о разнице между RTL и LTR .

0 голосов
/ 24 сентября 2019

Попробуйте это

console.log("2132-سسس".split('-').sort());
console.log("8635-بحد".split('-').sort());
console.log("سسس-2132".split('-').sort());
console.log("1-حد".split('-').sort());
...