Problem polega na tym, że w bazie danych znajduje się pewna liczba ciągów, które są przechowywane w porządku nieleksykalnym. Prawdopodobnie pochodzą z aplikacji opartej na terminalu znakowym, która może przechowywać tylko znaki w kolejności od lewej do prawej.
Możesz wymusić na zgodnych aplikacjach wyświetlanie arabskiego od lewej do prawej, używając specjalnego znaku Unicode LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. Wymusza to renderowanie wszystkich znaków od lewej do prawej, niezależnie od tego, jak normalnie byłyby renderowane.
Efekt kończy się na końcu ciągu lub na znaku PDF U+202C POP DIRECTIONAL FORMATTING
.
W twoim przypadku wszystko, co musisz zrobić, to umieścić znak LRO na początku każdego ciągu, którego dotyczy problem:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Liczba 8237 dziesiętny odpowiednik szesnastkowego 202D
.
Jeśli możesz łączyć te ciągi z innymi ciągami, które są prawidłowo przechowywane, powinieneś również użyć znaku PDF na końcu:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
To informuje silnik renderujący tekst, że wymuszona sekwencja od lewej do prawej dobiegła końca.
Więcej informacji znajdziesz tutaj:
Uwagi:
- Łączące się znaki nie będą się łączyć prawidłowo
- Oprogramowanie do zamiany tekstu na mowę nie będzie działać – prawdopodobnie odczyta je alfabetycznie, ale nie jestem pewien.
Dalsze informacje
Znaki należy przechowywać w kolejności, w jakiej są pisane lub czytane, a nie w kolejności, w jakiej są wyświetlane. Na przykład ciąg:
test اختبار test
powinny być przechowywane jako
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
Zwróć uwagę, że najbardziej lewy wyświetlany znak arabski jest przechowywany na pozycji 12 (substring(@var, 12, 1)
), a wyświetlany po prawej stronie znajduje się na pozycji 7 (substring(@var, 7, 1)
). Jeśli po prostu policzysz znaki pozycji, tak jak są one wyświetlane od lewej do prawej, część arabska jest odwrócona w porównaniu do tego, jak jest przechowywana. Ale to dlatego, że ta część powinna być czytana od prawej do lewej, dlatego jest wyświetlana od prawej do lewej.
Aby rozwiązać problem, musisz najpierw sprawdzić:Czy ciągi są przechowywane nieprawidłowo CZY są przechowywane prawidłowo, ale wyświetlane nieprawidłowo?