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

blpfk2vs  于 2022-12-03  发布在  SQL Server
关注(0)|答案(2)|浏览(196)

如何将字符串'۱۳۹۴'转换为'1394'
我尝试更改排序规则,但不起作用。
请注意,我用C#从外部设备读取数据。

2skhul33

2skhul331#

我试着解决这个问题,在网上搜索后,我得出结论,解决这个问题的最好方法是功能

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-Code和使用在我们的计划

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)) + ';'

结果将是

uyhoqukh

uyhoqukh2#

根据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))

如果输入字符串只包含数字,并且为了适应bigint,它被限制在4个字符以内,那么这种方法就有效。对于更长的字符串,应该使用WHILE循环来处理每个字符。

相关问题