如何在SQL Server中修复与英语混合的反向阿拉伯字符

时间:2014-03-17 16:09:21

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2012

我有一个sql server数据库,表列包含同一字段中的阿拉伯语和英语字符,就像Oracle اوراكل

一样

寻求帮助将阿拉伯字符从英文字符中分离出来以反转它们。因为阿拉伯字符在字段中没有特定的位置,开始,结束或在字段中间。

编辑这些字符来自旧的IBM大型机应用程序,并以错误的顺序存储,即它们按照从左到右显示的顺序存储,而不是按顺序存储被阅读。

我们需要的是让它们在其他应用程序中正确显示。

2 个答案:

答案 0 :(得分:2)

问题是数据库中有许多字符串,由于遗留原因,这些字符串以非词法顺序存储。可能它们来自基于字符终端的应用程序,它只能以从左到右的顺序存储字符。

您可以强制合规应用程序使用特殊的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 

这告诉文本呈现引擎强制的“从左到右”序列已经结束。

有关详细信息,请参阅此处:

注意:

  • 组合字符无法正确组合
  • 文字转语音软件无法正常工作 - 它可能会按字母顺序读取,但我不确定。

更多信息

字符应按其写入或读取的顺序存储,而不是按照显示的顺序存储。例如,字符串:

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))。如果您只是计算从左到右显示的位置字符,则阿拉伯语部分与其存储方式相比显示为反转。但那是因为该部分应该从右到左阅读,因此它从右到左显示。

要解决您的问题,您首先需要检查:字符串是否存储错误,或者它们是否存储正确但显示错误?

答案 1 :(得分:0)

在oracle中,同样的解决方案就像:

for