Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come correggere i caratteri arabi invertiti mescolati con l'inglese nel server SQL

Il problema è che hai un numero di stringhe nel database che, per motivi legacy, sono archiviate in ordine non lessicale. Probabilmente provenivano da un'applicazione basata su un terminale di caratteri che può memorizzare solo i caratteri nell'ordine da sinistra a destra.

Puoi forzare le applicazioni conformi a visualizzare l'arabo da sinistra a destra utilizzando il carattere Unicode speciale LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Questo costringe tutti i personaggi a renderizzare da sinistra a destra indipendentemente da come verrebbero normalmente renderizzati.

L'effetto termina alla fine della stringa o al carattere PDF U+202C POP DIRECTIONAL FORMATTING .

Nel tuo caso tutto ciò che devi fare è inserire il carattere LRO all'inizio di ogni stringa interessata:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Il numero 8237 è l'equivalente decimale di 202D esadecimale .

Se potresti concatenare queste stringhe con altre stringhe che sono state memorizzate correttamente, dovresti anche usare il carattere PDF alla fine:

select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable 

Questo dice al motore di rendering del testo che la sequenza forzata da sinistra a destra è giunta al termine.

Per ulteriori informazioni, vedere qui:

Note:

  • I caratteri combinati non verranno combinati correttamente
  • Il software di sintesi vocale non funzionerà:probabilmente lo leggerà in ordine alfabetico ma non ne sono sicuro.

Ulteriori informazioni

I caratteri devono essere memorizzati nell'ordine in cui sono scritti o letti, non nell'ordine in cui sono visualizzati. Quindi, ad esempio, la stringa:

test اختبار test

dovrebbe essere memorizzato come

01  t
02  e
03  s
04  t
05   
07  ا
خ  08  
09  ت
10  ب  
11  ا
12  ر
13 
14  t
15  e
16  s
17  t

Si noti che il carattere arabo più a sinistra visualizzato è memorizzato nella posizione 12 (substring(@var, 12, 1) ), e quello più a destra visualizzato è alla posizione 7 (substring(@var, 7, 1) ). Se si contano semplicemente i caratteri delle posizioni mentre vengono visualizzati da sinistra a destra, la parte araba appare invertita rispetto a come è memorizzata. Ma questo perché quella parte dovrebbe essere letta da destra a sinistra, quindi viene visualizzata da destra a sinistra.

Per risolvere il tuo problema devi prima controllare:le stringhe sono memorizzate in modo errato OPPURE sono memorizzate correttamente ma visualizzate in modo errato?