Come funziona la suddivisione JavaScript su stringhe di numeri arabi più inglesi?




arabic (3)

Quando ho provato a dividere:

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

quindi JavaScript mi ​​dà questo risultato:

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

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

E quando ho provato a dividere:

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

mi dà questo diverso risultato:

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

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

Come sta succedendo questo? Come può essere implementato correttamente?


Dipende da come si digita la stringa (da sinistra a destra / da destra a sinistra). Nella domanda fornita, "2132-سسس" è stato digitato da sinistra a destra e "8635-بحد" è stato digitato da destra a sinistra.

Controlla lo snippet di seguito.

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('-'));


Invece di considerare la direzione del testo come un problema da controllare a livello di markup o formattazione, Unicode richiede che sia elaborato a livello di set di caratteri. In assenza di caratteri di formattazione che potrebbero forzare la direzione del testo, alcuni caratteri (come le lettere dell'alfabeto latino) vengono visualizzati da sinistra a destra, alcuni (come le lettere arabe o ebraiche) vengono visualizzati da destra a sinistra e altri (come i segni di punteggiatura) può essere visualizzato in modi che dipendono dai caratteri precedenti e alcuni (come le cifre) possono essere visualizzati da sinistra a destra come gruppo, ma con i gruppi visualizzati in base alla direzione del testo precedente.

Se le lettere maiuscole nel testo (caratteri specificati in ordine, da sinistra a destra) abc123 456XYZdef fossero in un alfabeto da destra a sinistra, il testo verrebbe visualizzato come abc123 456ZYXdef , con i caratteri da destra a sinistra mostrati a destra da sinistra a sinistra. Se l'ordine dei personaggi fosse stato (di nuovo, leggendo rigorosamente da sinistra a destra) sarebbe stato abcXYZ456 123def sarebbe visualizzato come abc123 456ZYXdef perché i due gruppi di numeri sarebbero visualizzati nell'ordine da destra a sinistra, a sinistra del precedente il testo da destra a sinistra, anche se i numeri all'interno di ciascun gruppo avrebbero letto da sinistra a destra.

Come conseguenza di queste regole, è impossibile conoscere l'ordine dei caratteri in una stringa semplicemente guardandolo. L'unico modo per sapere davvero cosa sta succedendo è traslitterare i caratteri in forme come le loro rappresentazioni esadecimali che hanno un ordinamento coerente.


Questo dipende da come viene digitata la stringa ( ltr or rtl ).

Per comprendere la differenza, impostare l'attributo dir sull'input e quindi dividere il valore:

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>

Per ulteriori informazioni, leggi la differenza tra RTL e LTR .







arabic