use*_*592 5 sql-server sql-server-2005 sql-server-2008 sql-server-2012
我有一个sql server数据库有表列,包含阿拉伯语和英文字符在同一个字段中就像 Oracle ??????
寻求你帮助将阿拉伯字符从英语字符中分离出来以反转它们.因为阿拉伯字符在字段中没有特定的位置,开始,结束或在字段的中间.
编辑字符来自旧的IBM大型机应用程序,并以错误的顺序存储,即它们按照从左到右显示的顺序存储,而不是按照要读取的顺序存储.
所需要的是使它们在其他应用程序中正确显示.
问题是数据库中有许多字符串,由于遗留原因,它们以非词汇顺序存储。它们可能来自基于字符终端的应用程序,该应用程序只能按从左到右的顺序存储字符。
\n\n您可以使用特殊的 Unicode 字符强制兼容的应用程序从左到右显示阿拉伯语LRO U+202D: LEFT-TO-RIGHT OVERRIDE。这会强制所有字符从左到右呈现,无论它们通常如何呈现。
效果在字符串末尾或字符处结束PDF U+202C POP DIRECTIONAL FORMATTING。
在您的情况下,您需要做的就是将 LRO 字符放在每个受影响的字符串的开头:
\n\nselect nchar(8237) + columnName as columnNameDisplay\nfrom BadTable \nRun Code Online (Sandbox Code Playgroud)\n\n数字 8237 相当于十六进制的十进制202D。
如果您可能要将这些字符串与正确存储的其他字符串连接起来,则还应该在末尾使用 PDF 字符:
\n\nselect nchar(8237) + columnName + nchar(8236) as columnNameDisplay\nfrom BadTable \nRun Code Online (Sandbox Code Playgroud)\n\n这告诉文本渲染引擎强制从左到右的顺序已经结束。
\n\n欲了解更多信息,请参见此处:
\n\n\n\n笔记:
\n\n更多信息
\n\n字符应按写入或读取的顺序存储,而不是按显示的顺序存储。例如,字符串:
\n\ntest \xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1 test\nRun Code Online (Sandbox Code Playgroud)\n\n应存储为
\n\n01 t\n02 e\n03 s\n04 t\n05 \n07 \xd8\xa7\n\xd8\xae 08 \n09 \xd8\xaa\n10 \xd8\xa8 \n11 \xd8\xa7\n12 \xd8\xb1\n13 \n14 t\n15 e\n16 s\n17 t\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,显示的最左边的阿拉伯字符存储在位置 12 ( substring(@var, 12, 1)),显示的最右边的阿拉伯字符存储在位置 7 ( substring(@var, 7, 1))。如果您只是简单地计算从左到右显示的位置字符,则阿拉伯语部分与其存储方式相比会出现相反的情况。但那是因为该部分应该从右向左阅读,因此它是从右向左显示的。
要解决您的问题,您首先需要检查:字符串是否存储错误,或者它们存储正确但显示错误?
\n| 归档时间: |
|
| 查看次数: |
5224 次 |
| 最近记录: |