Usuário com melhor resposta
Remover acentos e caracteres especiais para cliente poder consumir WebService

Pergunta
-
Olá à todos!
Meu sistema disponibiliza um WebService para um determinado cliente poder atualizar algumas informações no sistema dele. O problema é que o sistema dele não recebe os registros cujo nome possua acentos ou caracteres especiais. Por exemplo João da Silva, Flávio Augusto, Joana D'Arc e etc... Não sei se o sistema dele é arcaico ou o que pode ser, mas ele aceita apenas Joao da Silva, Flavio Augusto, Joana DArc e etc...
Como eu faria pra formatar os dados que estão no meu banco para que fossem enviados sem acentos e caracteres especiais?
Nota: Eu quero que no meu banco os dados continuem como estão, acentuados, pois os cadastros são realizados por outros clientes e os mesmos cadastram com acentos e em alguns casos com apóstrofo.
Banco utilizado: SQL Server 2008
Sistema desenvolvido em: Asp.net, C#
Agradeço as sugestões!
Respostas
-
Opa... tenho uma solução meio doida... mas acho que pode ser a mais simples no final... consiste em:
- Criar um outro WebService, herdado do seu WebService de uso...
- Reescrever os WebMetodos... para chamar uma função que remove os caracteres invalidos antes de retornar os dados..
- Usar refactoring para automatizar a remoção dos caracteres...
Um exemplo mais ou menos do que estou dizendo:
using System; using System.Linq; using System.Reflection; using System.Web.Services; namespace MSDN.ASP { public class WebServicePadrao : WebService { [WebMethod] public Cliente[] ListarClientes() { return new Cliente[0]; } } public class WebServiceSemAcento : WebServicePadrao { private static String Remover(string s) { var retorno = String.Empty; var comacentos = "ÇÁÀÂÃÄÉÈÊËÍÌÎÏÓÒÔÕÖÚÙÛÜçáàâãäéèêëíìîïóòôõöúùûü"; var semacento = "CAAAAAEEEEIIIIOOOOOUUUUcaaaaaeeeeiiiiooooouuuu"; for (int i = 0; i < retorno.Length; i++) { if (Char.IsLetterOrDigit(s[i])) { var pos = comacentos.IndexOf(s[i]); retorno += (pos == -1) ? s[i] : semacento[pos]; } } return retorno; } private static TResult RemoverAcentos<TResult>(TResult obj) { var type = obj.GetType(); var result = (TResult)type.Assembly.CreateInstance(type.GetElementType().FullName); var propiedades = type.GetElementType().GetProperties(BindingFlags.Public).Where(p => p.DeclaringType == typeof(string)); foreach (var property in propiedades) { property.SetValue(result, Remover(property.GetValue(obj, null).ToString()), null); } return result; } [WebMethod] public new Cliente[] ListarClientes() { var lista = base.ListarClientes().ToList(); lista.ForEach(item => RemoverAcentos(item)); return lista.ToArray(); } } public class Cliente { public string Nome { get; set; } public string Empresa { get; set; } } }
Mas isso só funcionaria se vc somente presicsar enviar os dados desta forma... se vc for receber... ai não tem muito o que se fazer...
- Sugerido como Resposta Rogério Ohashi terça-feira, 7 de junho de 2011 13:30
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 14 de junho de 2011 13:35
Todas as Respostas
-
Opa... tenho uma solução meio doida... mas acho que pode ser a mais simples no final... consiste em:
- Criar um outro WebService, herdado do seu WebService de uso...
- Reescrever os WebMetodos... para chamar uma função que remove os caracteres invalidos antes de retornar os dados..
- Usar refactoring para automatizar a remoção dos caracteres...
Um exemplo mais ou menos do que estou dizendo:
using System; using System.Linq; using System.Reflection; using System.Web.Services; namespace MSDN.ASP { public class WebServicePadrao : WebService { [WebMethod] public Cliente[] ListarClientes() { return new Cliente[0]; } } public class WebServiceSemAcento : WebServicePadrao { private static String Remover(string s) { var retorno = String.Empty; var comacentos = "ÇÁÀÂÃÄÉÈÊËÍÌÎÏÓÒÔÕÖÚÙÛÜçáàâãäéèêëíìîïóòôõöúùûü"; var semacento = "CAAAAAEEEEIIIIOOOOOUUUUcaaaaaeeeeiiiiooooouuuu"; for (int i = 0; i < retorno.Length; i++) { if (Char.IsLetterOrDigit(s[i])) { var pos = comacentos.IndexOf(s[i]); retorno += (pos == -1) ? s[i] : semacento[pos]; } } return retorno; } private static TResult RemoverAcentos<TResult>(TResult obj) { var type = obj.GetType(); var result = (TResult)type.Assembly.CreateInstance(type.GetElementType().FullName); var propiedades = type.GetElementType().GetProperties(BindingFlags.Public).Where(p => p.DeclaringType == typeof(string)); foreach (var property in propiedades) { property.SetValue(result, Remover(property.GetValue(obj, null).ToString()), null); } return result; } [WebMethod] public new Cliente[] ListarClientes() { var lista = base.ListarClientes().ToList(); lista.ForEach(item => RemoverAcentos(item)); return lista.ToArray(); } } public class Cliente { public string Nome { get; set; } public string Empresa { get; set; } } }
Mas isso só funcionaria se vc somente presicsar enviar os dados desta forma... se vc for receber... ai não tem muito o que se fazer...
- Sugerido como Resposta Rogério Ohashi terça-feira, 7 de junho de 2011 13:30
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 14 de junho de 2011 13:35
-