RTF до SQL со специальными символами (ñ и ударением) - PullRequest
0 голосов
/ 01 мая 2020

У меня есть столбец с типом данных rtf в SQL, и я хочу преобразовать его в тип varchar(max) rtf может содержать акцент и символ С

Мне нужен только текст из этих данных.

Пример RTF:

{\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang11274 {\ fonttbl {\ f0 \ fnil \ fprq1 \ fcharset0 Verdana;} {\ f1 \ fswiss \ fprq2 \ fcharset0 Verdana; } {\ f2 \ fnil \ fcharset0 MS Sans Serif;} {\ f3 \ fnil \ fcharset2 Symbol;}} {\ colortbl; \ red8 \ green0 \ blue0; \ red0 \ green0 \ blue0; \ red0 \ green0 \ blue255;} {* \ generator Msftedit 5.41.21.2510;} \ viewkind4 \ uc1 \ pard {\ pntext \ f3 \ 'B7 \ tab} {* \ pn \ pnlvlblt \ pnf3 \ pnindent0 {\ pntxtb \' B7}} \ qj \ cf1 \ f0 \ fs16 Pasaje a \ 'e9reo de \ b AEROLINEAS ARGENTINAS \ b0 (Буэнос-Айрес / Сальвадор / Буэнос-Айрес) en clase \ b \ ldblquote V \ rdblquote \ cf2 \ b0 \ i sin equipaje incis \ i0 \ par \ pard {pard {p \ pntext \ f3 \ 'B7 \ tab} {* \ pn \ pnlvlblt \ pnf3 \ pnindent0 {\ pntxtb \' B7}} регулярное обслуживание \ par {\ pntext \ f3 \ 'B7 \ tab} 7 ношений в пользу конъюнктуры \ 'e9gimen seg \' fan se indica \ par \ pard {\ pntext \ f3 \ 'B7 \ tab} {* \ pn \ pnlvlblt \ pnf3 \ pn indent0 {\ pntxtb \ 'B7}} \ qj \ cf0 Asistencia al viajero \ b ДИАМАНТ ТУРИСТИЧЕСКОГО ТУРА \ b0 con seguro de Cancelaci \' f3n \ b КОНСУЛЬТАТ ОГРАНИЧЕНИЯ КАЗА \ b0 para pasajeros con edad de hasta 70 a \ 'f1os cumplid , Partir de los 71 a '' f1os se deber \

Используемая функция:

ALTER FUNCTION [dbo].[RTF2TXT]
(@In VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    If isnull(@In,'') = '' return ''
    If @In not like '{\rtf%' return @In
    Declare @Len int
    Declare @Loc int = 1
    Declare @Char char(1) = ''
    Declare @PrevChar char(1) = ''
    Declare @NextChar char(1) = ''
    Declare @InMarkup int = 0
    Declare @InBrackets int = -1
    Declare @Out varchar(max) = ''

        Set @Len = len(@In)
        While @Loc < @Len begin
            Set @PrevChar = @Char
            Set @Char = SUBSTRING(@In, @Loc, 1)
            If @Loc < @Len set @NextChar = SUBSTRING(@In, @Loc + 1, 1) else set @NextChar = ''
            Set @Loc = @Loc + 1
            If @Char = '{' and @PrevChar != '\' begin
                Set @InBrackets = @InBrackets + 1
                Continue
            End
            If @Char = '}' and @PrevChar != '\' begin
                Set @InBrackets = @InBrackets - 1
                Continue
            End
            If @Char = '\' and @PrevChar != '\' and @NextChar not in ('\','{','}','~','-','_') begin
                Set @InMarkup = 1
                continue
            End
            If @Char = ' ' or @Char = char(13) begin
                Set @InMarkup = 0

            End
            If @InMarkup > 0 or @InBrackets > 0 continue

            Set @Out = @Out + @Char

        End

    Set @Out = replace(@Out, '\\', '\')
    Set @Out = replace(@Out, '\{', '{')
    Set @Out = replace(@Out, '\}', '}')
    Set @Out = replace(@Out, '\~', ' ')
    Set @Out = replace(@Out, '\-', '-')
    Set @Out = replace(@Out, '\_', '-')
    SET @Out = REPLACE(@Out, '\pard', '');
    SET @Out = REPLACE(@Out, '\ulnone', '');
    SET @Out = REPLACE(@Out, '\ul', '');
    SET @Out = REPLACE(@Out, '{', '');
     SET @Out = REPLACE(@Out, '*', '');
    SET @Out = REPLACE(@Out, 'Msftedit 5.41.21.2510;}', '');



    WHILE ASCII(@Out) < 33
    BEGIN
    set @Out = substring(@Out,2,len(@Out))
    END

    set @Out = reverse(@Out)

    WHILE ASCII(@Out) < 33
    BEGIN
    set @Out = substring(@Out,2,len(@Out))
    END

    set @Out = reverse(@Out)

    RETURN LTRIM(RTRIM(@Out))
End

1 Ответ

1 голос
/ 01 мая 2020

Многие распространенные параметры сортировки используют кодовую страницу, содержащую Ñ. Поэтому просто убедитесь, что ваш столбец (или база данных) использует один из них.

В частности Latin1_General_CI_AS - это сопоставление по умолчанию для поля Windows, для которого установлено значение "Spani sh (United States)".

Конечно, вы всегда можете использовать nvarchar(max) вместо этого. На SQL 2019+ вы также можете использовать varchar(max) одну из новых кодировок UTF8.

...