问题是数据库中有许多字符串,由于遗留原因,它们以非词汇顺序存储。它们可能来自基于字符终端的应用程序,该应用程序只能按从左到右的顺序存储字符。
您可以使用特殊的 Unicode 字符强制兼容的应用程序从左到右显示阿拉伯语LRO U+202D: LEFT-TO-RIGHT OVERRIDE
。这会强制所有字符从左到右呈现,无论它们通常如何呈现。
效果在字符串末尾或字符处结束PDF U+202C POP DIRECTIONAL FORMATTING
.
在您的情况下,您需要做的就是将 LRO 字符放在每个受影响的字符串的开头:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
数字 8237 的十进制等价于十六进制202D
.
如果您可能要将这些字符串与正确存储的其他字符串连接起来,则还应该在末尾使用 PDF 字符:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
这告诉文本渲染引擎强制从左到右的顺序已经结束。
欲了解更多信息,请参见此处:
- http://www.unicode.org/reports/tr9/#Explicit_Directional_Overrides http://www.unicode.org/reports/tr9/#Explicit_Directional_Overrides
Notes:
- 组合字符将无法正确组合
- 文本转语音软件不起作用 - 它可能会按字母顺序读取,但我不确定。
更多信息
字符应按写入或读取的顺序存储,而不是按显示的顺序存储。例如,字符串:
test اختبار test
应存储为
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
请注意,显示的最左边的阿拉伯字符存储在位置 12 (substring(@var, 12, 1)
),显示的最右边位于位置 7(substring(@var, 7, 1)
)。如果您只是简单地计算从左到右显示的位置字符,则阿拉伯语部分与其存储方式相比会出现相反的情况。但那是因为该部分应该从右向左阅读,因此它是从右向左显示的。
要解决您的问题,您首先需要检查:字符串是否存储错误,或者它们存储正确但显示错误?