Sql server 在SQL Server中将unicode字符串转换为ascii

Sql server 在SQL Server中将unicode字符串转换为ascii,sql-server,tsql,unicode,Sql Server,Tsql,Unicode,如何将字符串“۱ۯ۴”转换为“1394” 我尝试更改排序规则,但不起作用 请注意,我在C#中从外部设备读取数据。我在互联网上搜索后试图解决问题。我得出结论,解决此问题的最佳方法是函数 ALTER FUNCTION [dbo].[udf_ReplaceArabicNumbers] (@str NVARCHAR(1000)) RETURNS NVARCHAR(2000) AS BEGIN DECLARE @i INT = 1 WHILE @i<=LEN(@st

如何将字符串
“۱ۯ۴”
转换为
“1394”

我尝试更改排序规则,但不起作用


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

我在互联网上搜索后试图解决问题。我得出结论,解决此问题的最佳方法是函数

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
我指的是这个网站 在
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)) + ';'
结果将是


根据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循环来处理每个字符。

1394@tinka对看看你为什么不在阅读时进行转换呢?就你的语言而言,它们可能是同一个单词,但实际上就unicode字符而言,它们是两个不同的实体。这就像要求系统自动将“1”转换为“1”。除非您使用映射表,否则无法完成。嗨,我不知道,但您尝试过这个吗?选择ASCII(“ASCII”),但它返回63而不是1394。
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))