none
Remover acentos e caracteres especiais para cliente poder consumir WebService RRS feed

  • 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!


    sexta-feira, 3 de junho de 2011 18:29

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...

     

    terça-feira, 7 de junho de 2011 00:17
    Moderador

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...

     

    terça-feira, 7 de junho de 2011 00:17
    Moderador
  • Muito interessante essa sugestão. Irei testar pra ver como irá se comportar dessa forma.

    Muito obrigado!

    terça-feira, 7 de junho de 2011 13:29