2015-07-26 2 views
2

Как преобразовать строку '۱۳۹۴' в '1394'?Преобразование строки Unicode в ascii в SQL Server

Я стараюсь изменить сортировку, но не работает.

Обратите внимание, что я прочитал данные с внешнего устройства на C#.

+0

'1394' это действительно 1394 – wiretext

+0

@tinka да. см. http://unicode-table.com/ru/#arabic – Hamid

+0

Почему вы не конвертируете его, когда читаете его? – Paparazzi

ответ

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

и результат был бы

enter image description here

0

Исходя из свойств чисел юникода кода точки, вы могли бы использовать что-то вроде этого:

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 для обработки каждого символа.

Смежные вопросы