Vấn đề là bạn có một số chuỗi trong cơ sở dữ liệu, vì lý do kế thừa, được lưu trữ theo thứ tự không từ vựng. Có thể chúng đến từ một ứng dụng dựa trên ký tự đầu cuối chỉ có thể lưu trữ các ký tự theo thứ tự từ trái sang phải.
Bạn có thể buộc các ứng dụng tuân thủ hiển thị từ Trái sang phải bằng tiếng Ả Rập bằng cách sử dụng ký tự Unicode đặc biệt LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. Điều này buộc tất cả các ký tự phải được hiển thị từ trái sang phải bất kể chúng sẽ được hiển thị như thế nào bình thường.
Hiệu ứng kết thúc ở cuối chuỗi hoặc tại ký tự PDF U+202C POP DIRECTIONAL FORMATTING
.
Trong trường hợp của bạn, tất cả những gì bạn cần làm là đặt ký tự LRO ở đầu mỗi chuỗi bị ảnh hưởng:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Số 8237 số thập phân tương đương với hệ thập lục phân 202D
.
Nếu bạn có thể nối các chuỗi này với các chuỗi khác được lưu trữ đúng cách, bạn cũng nên sử dụng ký tự PDF ở cuối:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
Điều này cho công cụ kết xuất văn bản biết rằng trình tự trái sang phải bắt buộc đã kết thúc.
Thông tin chi tiết xem tại đây:
Ghi chú:
- Các ký tự kết hợp sẽ không kết hợp đúng cách
- Phần mềm chuyển văn bản thành giọng nói sẽ không hoạt động - nó có thể sẽ đọc nó theo thứ tự bảng chữ cái nhưng tôi không chắc.
Thông tin khác
Các ký tự phải được lưu trữ theo thứ tự chúng được viết hoặc đọc, không phải theo thứ tự chúng được hiển thị. Ví dụ:chuỗi:
test اختبار test
nên được lưu trữ dưới dạng
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
Lưu ý rằng ký tự Ả Rập ngoài cùng bên trái như được hiển thị được lưu trữ ở vị trí 12 (substring(@var, 12, 1)
), và cột ngoài cùng bên phải như được hiển thị nằm ở vị trí 7 (substring(@var, 7, 1)
). Nếu bạn chỉ đếm các ký tự vị trí khi chúng được hiển thị từ trái sang phải, phần tiếng Ả Rập sẽ xuất hiện đảo ngược so với cách nó được lưu trữ. Nhưng đó là vì phần đó được cho là được đọc từ phải sang trái, do đó nó được hiển thị từ phải sang trái.
Để khắc phục sự cố của bạn, trước tiên, bạn cần kiểm tra:Các chuỗi được lưu trữ sai HOẶC chúng được lưu trữ đúng cách nhưng hiển thị sai?