- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 2 anos, 8 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
3 de maio de 2022 às 11:08 am #154727ElizaParticipante
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,
3 de maio de 2022 às 5:10 pm #154730José Laurindo ChiappaModeradorBlz : 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;3 de maio de 2022 às 5:14 pm #154732José Laurindo ChiappaModeradorselect 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,b62 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…
3 de maio de 2022 às 5:14 pm #154733José Laurindo ChiappaModeradorFeito 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
4 de maio de 2022 às 4:23 pm #154749ElizaParticipanteTardee!!
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 !! 🙂
4 de maio de 2022 às 5:08 pm #154754José Laurindo ChiappaModeradorBlz ? 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…
5 de maio de 2022 às 9:35 am #154758José Laurindo ChiappaModeradorC1 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 ??
-
AutorPosts
- Você deve fazer login para responder a este tópico.