【问题标题】:Convert unicode string to ascii in SQL Server在 SQL Server 中将 unicode 字符串转换为 ascii
【发布时间】:2015-10-16 12:49:36
【问题描述】:

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

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

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

【问题讨论】:

  • ۱۳۹۴真的是1394
  • @tinka 是的。见unicode-table.com/en/#arabic
  • 阅读时为什么不转换?
  • 就您的语言而言,它们可能是同一个词,但实际上就 unicode 字符而言,它们是两个不同的实体。这就像要求系统自动将“一”转换为“一”。除非您使用映射表,否则无法完成。
  • 嗨,我不知道,但你试过这个吗? SELECT ASCII('13۹۴') 但它返回 63 而不是 1394。

标签: sql-server tsql unicode


【解决方案1】:

我在网上搜索后尝试解决问题我得出的结论是解决这个问题的最佳方法是函数

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

结果是

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2010-12-09
      • 2018-03-07
      • 2015-03-29
      • 2015-11-28
      相关资源
      最近更新 更多