Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie umgekehrte arabische Zeichen, die mit Englisch in SQL Server gemischt sind

Das Problem ist, dass Sie eine Reihe von Zeichenfolgen in der Datenbank haben, die aus Legacy-Gründen in nicht lexikalischer Reihenfolge gespeichert sind. Wahrscheinlich stammen sie von einer Zeichenterminal-basierten Anwendung, die Zeichen nur in der Reihenfolge von links nach rechts speichern kann.

Sie können konforme Anwendungen zwingen, Arabisch von links nach rechts anzuzeigen, indem Sie das spezielle Unicode-Zeichen LRO U+202D: LEFT-TO-RIGHT OVERRIDE verwenden . Dadurch werden alle Zeichen von links nach rechts gerendert, unabhängig davon, wie sie normalerweise gerendert würden.

Der Effekt endet am Ende des Strings oder beim Zeichen PDF U+202C POP DIRECTIONAL FORMATTING .

In Ihrem Fall müssen Sie lediglich das LRO-Zeichen an den Anfang jeder betroffenen Zeichenfolge setzen:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Die Zahl 8237 ist das dezimale Äquivalent von hexadezimal 202D .

Wenn Sie diese Zeichenfolgen möglicherweise mit anderen Zeichenfolgen verketten, die korrekt gespeichert sind, sollten Sie auch das PDF-Zeichen am Ende verwenden:

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

Dies teilt der Text-Rendering-Engine mit, dass die erzwungene Links-nach-Rechts-Sequenz zu Ende ist.

Weitere Informationen finden Sie hier:

Hinweise:

  • Die Kombinationszeichen werden nicht richtig kombiniert
  • Text-to-Speech-Software funktioniert nicht - sie liest es wahrscheinlich alphabetisch, aber ich bin mir nicht sicher.

Weitere Informationen

Zeichen sollten in der Reihenfolge gespeichert werden, in der sie geschrieben oder gelesen werden, nicht in der Reihenfolge, in der sie angezeigt werden. Also zum Beispiel der String:

test اختبار test

sollte als

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

Beachten Sie, dass das ganz links angezeigte arabische Zeichen an Position 12 gespeichert wird (substring(@var, 12, 1)). ), und der ganz rechts angezeigte befindet sich an Position 7 (substring(@var, 7, 1)). ). Wenn Sie einfach die angezeigten Positionszeichen von links nach rechts zählen, erscheint der arabische Teil im Vergleich zur Speicherung umgekehrt. Aber das liegt daran, dass dieser Teil von rechts nach links gelesen werden soll, daher wird er von rechts nach links angezeigt.

Um Ihr Problem zu beheben, müssen Sie zuerst prüfen:Sind die Zeichenfolgen falsch gespeichert ODER werden sie korrekt gespeichert, aber falsch angezeigt?