在SQL Server中将包含阿拉伯字符的Unicode字符串转换为ASCII

3

如何将字符串'۱۳۹۴'转换为'1394'

我尝试更改排序规则,但并没有起作用。

请注意,我是在C#中从外部设备读取数据。


"۱۳۹۴" 真的是 1394 吗? - wiretext
@tinka 是的。请参见 http://unicode-table.com/en/#arabic - Hamid
在你的语言中,它们可能是相同的单词,但实际上它们在Unicode字符方面是两个不同的实体。这就像要求系统自动将“one”转换为“1”。除非使用映射表,否则无法完成。 - Alan
@kenlacoste ACSII 63只是“?”。这些字符中的每一个都将返回63。 - paparazzo
是的,我也注意到了,我认为你别无选择,只能像tinka的脚本一样使用UDF,或者像amer在这个论坛中的回答那样,通过数字交换修改你的C#代码,将西阿拉伯数字1、2、3转换为东阿拉伯数字。https://dev59.com/El_Va4cB1Zd3GeqPTXXT - ken lacoste
显示剩余2条评论
2个回答

3

我在网上搜索后尝试解决了这个问题,得出结论最好的解决方法是使用函数。

ALTER FUNCTION [dbo].[udf_ReplaceArabicNumbers]
    (@str NVARCHAR(1000))
    RETURNS NVARCHAR(2000)
AS
BEGIN

    DECLARE @i INT = 1
    WHILE @i<=LEN(@str)

    BEGIN
        DECLARE @val NVARCHAR(1)
        SET @val = SUBSTRING(@str, @i, 1)
            DECLARE @newchar NVARCHAR(1)
            SET @newchar = CASE(@val)
                    WHEN N'۱' THEN 1
                    WHEN N'۲' THEN 2
                    WHEN N'۳' THEN 3
                    WHEN N'۴' THEN 4
                    WHEN N'۵' THEN 5
                    WHEN N'۶' THEN 6
                    WHEN N'۷' THEN 7
                    WHEN N'۸' THEN 8
                    WHEN N'۹' THEN 9
                    WHEN N'۰' THEN 0
                END
        SET @str = REPLACE(@str, @val, @newchar)
        SET @i+=1;
    END

RETURN @str
END

并调用此函数。
select [dbo].[udf_ReplaceArabicNumbers] (N'۱۳۹۴')

我参考了这个网站http://unicode-table.com/en/

通过UNICODE,我们可以获取HTML代码并在我们的程序中使用。

select  '&#' + cast (UNICODE(N'۱')as nvarchar(10)) + ';',
        '&#' + cast (UNICODE(N'۳')as nvarchar(10)) + ';',
        '&#' + cast (UNICODE(N'۹')as nvarchar(10)) + ';',
        '&#' + cast (UNICODE(N'۴')as nvarchar(10)) + ';'

结果将会是:

在这里输入图片描述


0

基于 Unicode 代码点数字的属性,您可以使用类似以下的方法:

DECLARE @ArabicNumber NVARCHAR(4)
SET @ArabicNumber=N'۱۳۹۴'
SELECT 
    LEFT(CONVERT(NVARCHAR(4),CONVERT(VARBINARY(8), 
        CONVERT(BIGINT,CONVERT(VARBINARY(8),CONVERT(NCHAR(4),@ArabicNumber))) 
        & CONVERT(VARBINARY(8),REPLICATE(0x0F00,4))
        ^ CONVERT(VARBINARY(8),REPLICATE(0x3000,4))
    )),LEN(@ArabicNumber))

如果输入字符串仅包含数字且限制在4个字符以内,则适用于位运算,以适应bigint。对于更长的字符串,应使用WHILE循环处理每个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接