[Code inside] Conversion entre UTF-8 et ANSI (utf8 ansi transact sql)

Conversion entre UTF-8 et ANSI (utf8 ansi transact sql) [Code inside] - SQL/NoSQL - Programmation

Marsh Posté le 12-02-2007 à 13:54:12    

Voici les versions Transact-SQL des fonctions d'encodage/décodage UTF-8 que j'ai déjà posté dans ce forum pour VB :
 
/****************************************************************************************************
Encode une chaîne de caractères au format UTF8 / Unicode
****************************************************************************************************/
CREATE FUNCTION [dbo].[Encode_UTF8] (@ASTR nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
 declare @c int,@n int, @utftext nvarchar(4000)
 declare @res nvarchar(4000)
 
 set @utftext = ''
 set @n = 1  
 WHILE (@n <= Len(@ASTR))
 BEGIN
  set @c = unicode(substring(@ASTR, @n, 1))  
  if @c < 128
  begin
         set @utftext  = @utftext + substring(@ASTR, @n, 1)
  end
        else
  begin  
   if @c >= 128 And @c < 2048
   begin    
    set @utftext = @utftext + CHAR(((@c / 64) | 192))
    set @utftext = @utftext + CHAR(((@c & 63) | 128))
   end
   else
   begin
    if @c >= 2048 And @c < 65536
    begin
     set @utftext = @utftext + CHAR(((@c / 4096) | 224))
     set @utftext = @utftext + CHAR((((@c / 64) & 63) | 128))
     set @utftext = @utftext + CHAR(((@c & 63) | 128))
    end
    else -- @c >= 65536
    begin
     set @utftext = @utftext + CHAR(((@c / 262144) | 240))
     set @utftext = @utftext + CHAR((((@c / 4096) & 63) | 128))
     set @utftext = @utftext + CHAR((((@c / 64) & 63) | 128))
     set @utftext = @utftext + CHAR(((@c & 63) | 128))
    end
   end
  end
  set @n = @n + 1
 END  
 
 return (@utftext)
END
go
 
/****************************************************************************************************
Décode une chaîne de caractères au format UTF8 / Unicode
****************************************************************************************************/
CREATE FUNCTION [dbo].[Decode_UTF8]  (@ASTR nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
 Declare @c0 int, @c1 int, @c2 int, @c3 int, @n int ,@unitext nvarchar(4000)
 set @unitext = ''  
 set @n = 1
 
 if dbo.is_Utf8(@astr) = 0
 begin
  RETURN(@ASTR)
 end
 
 WHILE @n <= len(@ASTR)
    BEGIN
        set @c0 = ascii(substring(@astr, @n, 1))
        If @n <= Len(@astr) - 1
  begin
            set @c1 = ascii(substring(@astr, @n + 1, 1))
  end
        Else
  begin
            set @c1 = 0
        End
        If @n <= Len(@astr) - 2  
  begin
            set @c2 = ascii(substring(@astr, @n + 2, 1))
  end
        Else
  begin
            set @c2 = 0
        End
        If @n <= Len(@astr) - 3  
  begin
            set @c3 = ascii(substring(@astr, @n + 3, 1))
        End
        Else
  begin
            set @c3 = 0
        End
         
        If (@c0 & 240) = 240 And (@c1 & 128) = 128 And (@c2 & 128) = 128 And (@c3 & 128) = 128  
  begin
            set @unitext = @unitext + nchar((@c0 - 240) * 65536 + (@c1 - 128) * 4096) + (@c2 - 128) * 64 + (@c3 - 128)
            set @n = @n + 4
  end
        Else
  begin
   If (@c0 & 224) = 224 And (@c1 & 128) = 128 And (@c2 & 128) = 128  
   begin
             set @unitext = @unitext + nchar((@c0 - 224) * 4096 + (@c1 - 128) * 64 + (@c2 - 128))
          set @n = @n + 3
   end
   else
   begin
    If (@c0 & 192) = 192 And (@c1 & 128) = 128  
    begin
              set @unitext = @unitext + nchar((@c0 - 192) * 64 + (@c1 - 128))
        set @n = @n + 2
    end
    Else
    begin
     If (@c0 & 128) = 128
     begin
      set @unitext = @unitext + nchar(@c0 & 127)
      set @n = @n + 1
     end
     Else -- c0 < 128
     begin
      set @unitext = @unitext + nchar(@c0)
      set @n = @n + 1
     end
    end
   end
        End
 END  
 
 RETURN(@unitext)
END
go
 
/****************************************************************************************************
Vérifie qu'une chaîne de caractères est au format UTF8 / Unicode
****************************************************************************************************/
CREATE FUNCTION [dbo].[Is_UTF8](@ASTR nvarchar(4000))
RETURNS tinyint
AS
BEGIN    
 declare @c0 int, @c1 int, @c2 int, @c3 int, @n int
 
 set @n = 1
 while @n <= Len(@ASTR)
 begin
  set @c0 = ascii(substring(@ASTR, @n, 1))
  if (@n <= Len(@ASTR) - 1)
   set @c1 = ascii(substring(@ASTR, @n + 1, 1))
  else
   set @c1 = 0
  if (@n <= Len(@ASTR) - 2 )
   set @c2 = ascii(substring(@ASTR, @n + 2, 1))
  else
   set @c2 = 0
  if (@n <= Len(@ASTR) - 3 )
   set @c3 = ascii(substring(@ASTR, @n + 3, 1))
  else
   set @c3 = 0
         
        If (@c0 & 240) = 240
  begin
            If (@c1 & 128) = 128 And (@c2 & 128) = 128 And (@c3 & 128) = 128
                set @n = @n + 4
            Else
    return 0
  end
        Else
  begin
   If (@c0 & 224) = 224
   begin
    If (@c1 & 128) = 128 And (@c2 & 128) = 128
     set @n = @n + 3
    Else
     return 0
   end
   Else
   begin
    If (@c0 & 192) = 192
    begin
     If (@c1 & 128) = 128
      set @n = @n + 2
     Else
      return 0
    end
    Else
    begin
     If (@c0 & 128) = 0
      set @n = @n + 1
     Else
      return 0
    end
   end
  end
    end
 return 1
END
go


Message édité par Cyberpat92 le 12-02-2007 à 13:54:59
Reply

Marsh Posté le 12-02-2007 à 13:54:12   

Reply

Marsh Posté le 21-06-2012 à 14:33:40    

Je trouve ce post apres moulte recherche et la je viens de revivre. Apres 3 heures de galères sur l'affichage de symbole de devise récupéré dans une base SQLServer 2000, tu me sauve la vie.  
 
Je ne sais pas si c'est la methode la plus aproprié mais les utf8_encode, mb_convert_encoding et autre iconv n'ont rien donnés. Je prend ta fonction, je fait mon select direct avec ça et pouf je kif ....  
 
Merci beaucoup
 
Edit : Apres avoir encore rechercher car je voulais trouver une solution php pure . J'ai trouvé ce thread http://stackoverflow.com/questions [...] hing-utf-8 . La meilleur réponse à un lien avec un class d'encodage qui marche du tonner :)


Message édité par Gizmo_091 le 21-06-2012 à 14:46:59

---------------
Mon FeedBack
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed