SQLServer – função para converter string hexadecimal padrão UTF8 para Unicode legível

Certa vez recebemos um demanda para analisar uns dados exportados do AD da empresa (csv) e percebemos que todos os atributos com acentuação exportados estava em hexadecimal padrão UTF8 e precisávamos decodificar o hexadecimal para o padrão Unicode em uma string legível. Por exemplo, coisas do tipo “X’43414d504f204d4f5552c3834f’” passariam a significam “CAMPO MOURÃO”.

A tabela de conversão que ajudou bastante nas conversões foi http://www.utf8-chartable.de/

Depois de queimar um pouco de fosfato para entender o padrões de conversão de um lado para o outro bolamos seguinte a function o SQLServer para resolver o problema:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_hexutf8_to_unicode](@valorIN VARCHAR(3000))
RETURNS VARCHAR(3000)
AS

BEGIN

DECLARE @retorno VARCHAR(3000);
DECLARE @valor VARCHAR(3000);
DECLARE @utf varchar(20);
DECLARE @unicode varchar(20);

SET @valor = replace(replace(@valorIN, 'X''', '0x'), '''', '');
SET @valor = REPLACE(@valor, 'c383', '#');
SET @valor = REPLACE(@valor, 'e28093', '96');
SET @valor = REPLACE(@valor, 'c2ba', 'ba');


WHILE CHARINDEX('c3', @valor)<>0
BEGIN
	set @utf = SUBSTRING(@valor, CHARINDEX('c3', @valor), 4);
	set @unicode = RIGHT(CONVERT(varchar(max),CONVERT(VARBINARY(MAX),CONVERT(VARBINARY(MAX), '0x'+RIGHT(@utf, 2), 1)+64,1),1), 2);
	SET @valor = REPLACE(@valor, @utf, @unicode);
END
SET @valor = REPLACE(@valor, '#', 'c3');
SET @valor = CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), @valor, 1));

SET @retorno = @valor;


RETURN @retorno;
END;

Forma de uso:

select dbo.fn_hexutf8_to_unicode('X''43414d504f204d4f5552c3834f')

Espero que tenha sido útil, pois passamos um dia emocionante pra chegar neste resultado rs.

Deixe um comentário

Arquivado em SGBD Sql-Server, SQL

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s