Pular para o conteúdo
  • Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 2 anos, 8 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #154727
    Eliza
    Participante

      Bom dia,

      Na descrição do cadastro de produtos, muitas vezes copiam o texto de algum site da internet . Porém, fica oculto caracteres especiais.

      exemplo:

      TV PHILIPS 65″ 65PUG7625 LED       (gravado no arquivo)

      a gente só enxerga se convertermos para html , que fica assim:

      TV PHILIPS 65″ 65PUG7625 LED

      Como identificar esse caracter  na descrição que está gravada no arquivo.

      Preciso fazer uma função pra remover caracteres especiais.

      Até mais,

       

      #154730
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Blz : Então, vamos lá : PRIMEIRO, não só na Internet mas TAMBÉM em editores de texto rich-format (tipo MS-Word), em planilhas Excel e em MUITAS fontes/programas, SIM, o que está lá Não É um texto puro, pode ter SIM caracteres de controle, pode ter SIM formatação (tipo negrito/cores/tamanho de letra), com CERTEZA se neguim sair copiando de um lugar direto pra outro E não se atentar à isso, vai SIM ter “Sujeira”no meio do texto, o que PODE tanto ir de caracteres de controle invisíveis (como parece ser esse seu) Até informação de formatação de texto, caracteres em línguas orientais que o characterset do banco e/ou a tool de front-end não sabem exibir, sim….

        Muito bem : primeiro, para vc poder ver EXATAMENTE quais códigos de caracteres estão gravados numa string Oracle, vc pode pedir a função DUMP, que serve pra isso : antes de exemplificar, dei-xe AVisar que num database Oracle, a CODIFICAÇÃO DAS STRINGs (sejam datatypes CHAR ou VARCHAR/VARCHAR2) é PADRONIZADA a nível de database, quando vc cria um database vc ESCOLHER o Characterset dele, e TODAS AS STRINGS vão ser codificadas/armazenadas com ESSE characterset, assim se eventualmente vc tiver algum caracter imprimível mas que não apareça ou apareça com ponto de interrogação ou coisa do tipo, vc SABE que é impedância entre o characterset do banco E a codificação da string….
        O SEGUNDO ponto, que vc Não Diz Claramente mas pelo jeito acho que É o caso, o caracter não-exibível que normalmente aparece em texto HTML como   é o caracter UNICODE No-Break Space (NBSP), mostrado em https://www.compart.com/en/unicode/U+00A0

        Muito bem, vamos fazer um teste com caracteres UNICODE visíveis e não-visíveis pra simular a sua situação e exemplificar primeiro a função DUMP :

        create table TAB_TEST_UNICODE (c1 number, c2 varchar2(100));
        insert into TAB_TEST_UNICODE values (1, unistr(‘Some text\00A0 continues’) );
        insert into TAB_TEST_UNICODE values (2, UNISTR(‘abc\00e5\00A0\00f6’) );
        commit;

        #154732
        Avatar photoJosé Laurindo Chiappa
        Moderador

          select c1, c2, dump(C2, 1017) DUMP_DA_STRING from TAB_TEST_UNICODE;

          C1 C2 DUMP_DA_STRING


          1 Some text continues Typ=1 Len=21 CharacterSet=AL32UTF8: S,o,m,e, ,t,e,x,t,c2,a0, ,c,o,n,t,i,n,u,e,s
          2 abcå ö Typ=1 Len=9 CharacterSet=AL32UTF8: a,b,c,c3,a5,c2,a0,c3,b6

          2 linhas selecionadas.

          ==> veja no exemplo acima que esse meu database usa characterset AL32UTF8, e que a tool de front-end que usei CONSEGUE exibir caracteres UNICODE…

           

          #154733
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Feito o teste com DUMP e confirmado que esses caracteres que vc não vê mas estão presentes são realmente caracteres UNICODE, uma opção Simples pra vc os remover é usar a função ASCIISTR, que transforma os caracteres UNICODE nessa forma \nnnn : aí nessa forma transformada vc Elimina tudo que começa com \ e tem 4 números depois via REGEXP_REPLACE, é Exatamente o que é feito logo numa das primeiras resposta em https://stackoverflow.com/questions/2236475/finding-and-removing-non-ascii-characters-from-an-oracle-varchar2

            Abraços,

            Chiappa

            #154749
            Eliza
            Participante

              Tardee!!

              Tirar caracter especial…  parece tão simples mas tem tantos detalhes.

              Fiz assim e estou validando:

              :NEW.DESCRPROD := TRIM(REGEXP_REPLACE (CONVERT ( :NEW.DESCRPROD, ‘US7ASCII’, ‘WE8ISO8859P1’),
              ‘[^!@/.,;:<>#$%&()_=[:alnum:][:blank:]]||’));

               

              Vlw pelas dicas !!  🙂

               

               

              #154754
              Avatar photoJosé Laurindo Chiappa
              Moderador

                Blz ? testa aí mas eu ACREDITO que usar a função CONVERT ** absolutamente NÃO VAI DAR CERTO ** : PRIMEIRO os caracteres inexistentes no characterset indicado no CONVERT vão ser transformados em ? (o que PODE mexer com os ? naturalmente já presentes na string, se houverem perguntas no texto, digamos), E em Segundo lugar, ALGUNS caracteres UNICODE/UTF ** vão ** conseguir ser convertidos para caracteres ASCII “normais”, o que o seu REPLACE ** não ** teria como identificar…

                 

                #154758
                Avatar photoJosé Laurindo Chiappa
                Moderador

                  C1 C2 DUMP_DA_STRING_TEXTO DUMP_DA_STRING_HEX CONV


                  1 Some text  continues S,o,m,e, ,t,e,x,t,c2,a0, ,c,o,n,t,i,n,u,e,s Typ=1 Len=21: 53,6f,6d,65,20,74,65,78,74,c2,a0,20,63,6f,6e,74,69,6e,75,65,73 Some textA continues
                  2 abcå ö a,b,c,c3,a5,c2,a0,c3,b6 Typ=1 Len=9: 61,62,63,c3,a5,c2,a0,c3,b6 abc?YA ??
                  3 Pode haver perguntas ? P,o,d,e, ,h,a,v,e,r, ,p,e,r,g,u,n,t,a,s, ,? Typ=1 Len=22: 50,6f,64,65,20,68,61,76,65,72,20,70,65,72,67,75,6e,74,61,73,20,3f Pode haver perguntas ?

                  ==> veja que na linha 1 a função CONVERT ** CONVERTEU ** o caracter 00A0 para um A, E que na linha 2 alguns caracteres sem conversão foram transformados em ? o que Interfeririam em strings que já contém o caracter ? naturalmente)… Ok ??

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress