Pergunta

Imagine que tenho String em C#:"Eu não te vejo.."

Quero remover (substituir por nada ou etc.) esses símbolos "€™".

Como eu faço isso?

Foi útil?

Solução

Esse 'lixo' parece muito com alguém que interpretou dados UTF-8 como ISO 8859-1 ou Windows-1252, provavelmente repetidamente.

’ é a sequência C3 A2, E2 82 AC, E2 84 A2.

  • UTF-8 C3 A2 = U+00E2 = â
  • UTF-8 E2 82 AC = U+20AC = €
  • UTF-8 E2 84 A2 = U+2122 = ™

Então fazemos isso de novo:no Windows 1252 esta sequência é E2 80 99, então o caractere deveria ser U+2019, ASPA ÚNICA DIREITA (')

Você pode fazer várias passagens com matrizes de bytes, Encoding.UTF8 e Encoding.GetEncoding(1252) para transformar corretamente o lixo de volta no que foi inserido originalmente.Você precisará verificar seu processamento para encontrar os dois locais onde os dados UTF-8 foram interpretados incorretamente como Windows-1252.

Outras dicas

"I Don’t see ya..".Replace( "’", string.Empty);

Como esse lixo foi parar lá em primeiro lugar?Essa é a verdadeira questão.

Ao remover qualquer caractere não latino, você estará quebrando intencionalmente algum suporte de internacionalização.

Não se esqueça do coitado cujo nome tem um "â".

Isso parece perturbadoramente familiar para um problema de codificação de caracteres relacionado ao conjunto de caracteres do Windows armazenado em um banco de dados usando a codificação de caracteres padrão.Vejo que alguém votou contra Will, mas ele tem razão.Você pode estar resolvendo o problema imediato, mas as combinações de caracteres são ilimitadas se esse for o problema.

Se você realmente precisa fazer isso, as expressões regulares são provavelmente a melhor solução.

Eu recomendo fortemente que você pense sobre por que você tem que fazer isso - pelo menos alguns dos caracteres que você listou como indesejáveis ​​são perfeitamente válidos e úteis em outros idiomas, e apenas filtrá-los provavelmente irá incomodar pelo menos alguns de seus usuários internacionais.Como sueco, não consigo enfatizar o suficiente o quanto odiar sistemas que não conseguem lidar corretamente com nossos caracteres å, ä e ö.

Considere Regex.Replace(your_string, regex, "") - é isso que eu uso.

Teste cada caractere por vez para ver se é um caractere alfabético ou numérico válido e, caso contrário, remova-o da string.O teste de personagem é muito simples, basta usar...

char.IsLetterOrDigit;

Por favor, existem vários outros, como...

char.IsSymbol;
char.IsControl;

Regex.Replace("A string", "[^a-zA-Z ]","");

É assim que você faria em C#, embora essa expressão regular ([^a-zA-Z ]) deva funcionar na maioria dos idiomas.

[Editado:esqueci o espaço na regex]

O código ASCII/Inteiro para esses caracteres estaria fora dos intervalos alfabéticos normais.Procure e substitua por caracteres vazios.String tem um método Replace, acredito.

Use uma lista negra de coisas que você não deseja ou, de preferência, uma lista branca (conjunto).Com uma lista branca, você itera sobre a string e copia apenas as letras que estão na sua lista branca para a string resultante.Você disse remover, e a maneira de fazer isso é ter dois ponteiros, um para ler (R) e outro para escrever (W):

I Donââ‚
     W  R

se a vírgula estiver na sua lista de permissões, nesse caso você leria a vírgula e a escreveria onde à está e, em seguida, avançaria os dois ponteiros.UTF-8 é uma codificação multibyte, portanto, avançar o ponteiro pode não estar apenas adicionando ao endereço.

Com C, é uma maneira fácil de obter uma lista branca usando uma das funções predefinidas (ou macros):isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit.Nesse caso, você envia uma função de lista branca em vez de um conjunto, é claro.

Normalmente, quando vejo dados como os seus, procuro corrupção de memória ou evidências que sugiram que a codificação que espero é diferente daquela com a qual os dados foram inseridos.

/Allan

Eu tive o mesmo problema com lixo estranho jogado pela Adobe em um despejo EXIF.Passei uma hora procurando uma resposta direta e tentando inúmeras sugestões incompletas que não funcionaram aqui.

Este tópico, mais do que a maioria que li, estava repleto de perguntas profundas e investigativas como 'como isso chegou lá?', 'e se alguém tiver esse caractere em seu nome?', 'tem certeza de que deseja interromper a internacionalização?'.

Houve algumas demonstrações impressionantes de erudição postulando como esse lixo poderia ter chegado até aqui e explicando a evolução dos vários esquemas de codificação de caracteres.A pessoa queria saber como removê-lo, não como surgiu ou o que as organizações de padrões estão fazendo, por mais interessante que seja essa curiosidade.

Eu escrevi um pequeno programa que me deu a resposta certa.Em vez de parafrasear o conceito principal, aqui está o programa completo, independente e funcional (pelo menos no meu sistema) e a saída que usei para destruir o lixo:

#!/usr/local/bin/perl -w

# This runs in a dos window and shows the char, integer and hex values
# for the weird chars. Install the HEX values in the REGEXP below until
# the final test line looks normal. 
$str = 's: “Brian';  # Nuke the 3 werid chars in front of Brian.
@str = split(//, $str);
printf("len str '$str' = %d, scalar \@str = %d\n", 
    length $str, scalar @str);
$ii = -1;
foreach $c (@str)  {
   $ii++;
   printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
       ord($c), unpack("H*", $c));
}
# Take the hex characters shown above, plug them into the below regexp
# until the junk disappears!
($s2 = $str) =~ s/[\xE2\x80\x9C]//g;  # << Insert HEX values HERE
print("S2=>$s2<\n");  # Final test

Result:
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
len str 's: GÇ£Brian' = 11, scalar @str = 11
0) char 's', ord=115, hex='73'
1) char ':', ord=058, hex='3a'
2) char ' ', ord=032, hex='20'
3) char 'G', ord=226, hex='e2'
4) char 'Ç', ord=128, hex='80'
5) char '£', ord=156, hex='9c'
6) char 'B', ord=066, hex='42'
7) char 'r', ord=114, hex='72'
8) char 'i', ord=105, hex='69'
9) char 'a', ord=097, hex='61'
10) char 'n', ord=110, hex='6e'
S2=>s: Brian<

É normal!!!

Uma outra sugestão prática e funcional que encontrei:iconv -c -t ASCII <6s-2014.1031-238246.halloween.exf.dif > exf.ascii.dif

Se String tiver qualquer data indesejada, isso é uma boa maneira de remover essas datas indesejadas

     string InputString = "This is grate kingdom¢Ã‚¬â"; 
     string replace = "’";
     string OutputString= Regex.Replace(InputString, replace, "");

     //OutputString having the following result 

Está funcionando bem para mim, obrigado por olhar esta revisão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top