Masalahnya adalah Anda memiliki sejumlah string dalam database yang, karena alasan warisan, disimpan dalam urutan non-leksikal. Mungkin mereka berasal dari aplikasi berbasis terminal karakter yang hanya dapat menyimpan karakter dalam urutan kiri-ke-kanan.
Anda dapat memaksa aplikasi yang sesuai untuk menampilkan bahasa Arab Kiri-ke-Kanan dengan menggunakan karakter Unicode khusus LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. Ini memaksa semua karakter untuk dirender dari kiri ke kanan terlepas dari bagaimana mereka biasanya akan dirender.
Efeknya berakhir di akhir string atau pada karakter PDF U+202C POP DIRECTIONAL FORMATTING
.
Dalam kasus Anda, yang perlu Anda lakukan adalah meletakkan karakter LRO di awal setiap string yang terpengaruh:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Angka 8237 desimal setara dengan heksadesimal 202D
.
Jika Anda mungkin menggabungkan string ini dengan string lain yang disimpan dengan benar, Anda juga harus menggunakan karakter PDF di akhir:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
Ini memberi tahu mesin rendering teks bahwa urutan Kiri-Ke-Kanan yang dipaksakan telah berakhir.
Untuk informasi lebih lanjut lihat di sini:
Catatan:
- Penggabungan karakter tidak akan digabungkan dengan benar
- Perangkat lunak Text-to-speech tidak akan berfungsi - mungkin akan membacanya menurut abjad, tetapi saya tidak yakin.
Informasi Lebih Lanjut
Karakter harus disimpan sesuai urutan penulisan atau pembacaannya, bukan urutan tampilannya. Jadi misalnya, string:
test اختبار test
harus disimpan sebagai
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
Perhatikan bahwa karakter Arab paling kiri seperti yang ditampilkan disimpan pada posisi 12 (substring(@var, 12, 1)
), dan yang paling kanan seperti yang ditampilkan ada di posisi 7 (substring(@var, 7, 1)
). Jika Anda hanya menghitung karakter posisi seperti yang ditampilkan dari kiri ke kanan, bagian bahasa Arab tampak terbalik dibandingkan dengan cara penyimpanannya. Tapi itu karena bagian itu seharusnya dibaca dari kanan ke kiri, jadi ditampilkan dari kanan ke kiri.
Untuk memperbaiki masalah Anda, pertama-tama Anda harus memeriksa:Apakah string disimpan dengan salah ATAU disimpan dengan benar tetapi ditampilkan dengan salah?