JavaScript split 如何处理阿拉伯语加英语数字字符串?

How does JavaScript split work on Arabic plus English number strings?

当我尝试拆分时:

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

然后 JavaScript 给了我这个结果:

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

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

当我尝试拆分时:

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

它给了我这个不同的结果:

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

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

这是怎么回事?如何正确实施?

这取决于您键入字符串的方式(从左到右/从右到左)。在提供的问题中,“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('-'));

试试这个

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

这取决于您输入字符串的方式 (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>

有关详细信息,请阅读 the difference between RTL and LTR

Unicode 要求在字符集级别处理,而不是将文本方向视为要在标记或格式层控制的问题。在没有强制文本方向的格式化字符的情况下,某些字符(如拉丁字母)从左到右显示,一些(如阿拉伯语或希伯来语字母)从右到左显示,还有一些(如标点符号)可能以取决于前面字符的方式显示,并且一些(如数字)可能作为一组从左到右显示,但根据前面文本的方向显示组。

如果文本中的大写字母(按顺序指定的字符,从左到右)abc123 456XYZdef 是从右到左的字母表,则文本将显示为 abc123 456ZYXdef,其中从右到左的字符以从右到左的顺序显示。如果字符的顺序(同样,严格从左到右阅读)是 abcXYZ456 123def 它将显示为 abc123 456ZYXdef 因为两组数字将按从右到左的顺序显示, 在前面从右到左的文本的左侧,即使每个组中的数字都是从左到右阅读的。

由于这些规则,不可能仅通过查看就知道字符串中字符的顺序。真正知道发生了什么的唯一方法是将字符音译成具有一致顺序的十六进制表示形式。