Conversion entre UTF-8 et ANSI (utf8 ansi transact sql) [Code inside] - SQL/NoSQL - Programmation
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
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