Pregunta

Imagina que tengo String en C#:"No te veo..."

Quiero eliminar (reemplazar por nada o etc.) estos símbolos "â€⠄¢".

¿Cómo hago esto?

¿Fue útil?

Solución

Esa 'basura' se parece mucho a que alguien interpretó los datos UTF-8 como ISO 8859-1 o Windows-1252, probablemente repetidamente.

â€⠄¢ es la secuencia 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 = ™

Luego lo hacemos de nuevo:en Windows 1252 esta secuencia es E2 80 99, por lo que el carácter debería haber sido U+2019, COMILLA SIMPLE DERECHA (')

Puede realizar varios pases con matrices de bytes, Encoding.UTF8 y Encoding.GetEncoding(1252) para convertir correctamente la basura en lo que se ingresó originalmente.Deberá verificar su procesamiento para encontrar los dos lugares donde los datos UTF-8 se interpretaron incorrectamente como Windows-1252.

Otros consejos

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

¿Cómo llegó esa basura allí en primer lugar?Ésa es la verdadera pregunta.

Al eliminar cualquier carácter no latino, estarás rompiendo intencionalmente parte del soporte de internacionalización.

No olvides al pobre cuyo nombre tiene una "â".

Esto parece inquietantemente familiar para un problema de codificación de caracteres relacionado con el juego de caracteres de Windows almacenado en una base de datos utilizando la codificación de caracteres estándar.Veo que alguien rechazó a Will, pero tiene razón.Puede que estés resolviendo el problema inmediato, pero las combinaciones de personajes son ilimitadas si ese es el problema.

Si realmente tienes que hacer esto, las expresiones regulares son probablemente la mejor solución.

Sin embargo, te recomiendo encarecidamente que pienses por qué tienes que hacer esto: al menos algunos de los caracteres que enumeras como indeseables son perfectamente válidos y útiles en otros idiomas, y simplemente filtrarlos probablemente molestará al menos a algunos de tus usuarios. usuarios internacionales.Como sueco, no puedo enfatizar lo suficiente lo mucho que odiar sistemas que no pueden manejar nuestros caracteres å, ä y ö correctamente.

Considere Regex.Replace(your_string, regex, ""): eso es lo que yo uso.

Pruebe cada carácter por turno para ver si es un carácter alfabético o numérico válido y, en caso contrario, elimínelo de la cadena.La prueba de personaje es muy simple, solo usa...

char.IsLetterOrDigit;

Por favor hay varios otros como...

char.IsSymbol;
char.IsControl;

Regex.Replace("La cadena", "[^a-zA-Z ]","");

Así es como lo harías en C#, aunque esa expresión regular ([^a-zA-Z ]) debería funcionar en la mayoría de los lenguajes.

[Editado:olvidé el espacio en la expresión regular]

El código ASCII/Entero para estos caracteres estaría fuera de los rangos alfabéticos normales.Busque y reemplace con caracteres vacíos.String tiene un método Reemplazar, creo.

Utilice una lista negra de cosas que no desea, o preferiblemente una lista blanca (conjunto).Con una lista blanca, iteras sobre la cadena y solo copias las letras que están en tu lista blanca en la cadena de resultado.Dijiste eliminar, y la forma de hacerlo es tener dos punteros, uno que lees desde (R) y otro que escribes en (W):

I Donââ‚
     W  R

Si la coma está en su lista blanca, en este caso deberá leer la coma y escribirla donde está Ã y luego avanzar ambos punteros.UTF-8 es una codificación de varios bytes, por lo que es posible que al avanzar el puntero no solo se agregue a la dirección.

Con C, es fácil obtener una lista blanca utilizando una de las funciones (o macros) predefinidas:isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit.En este caso, envía una función de lista blanca en lugar de un conjunto, por supuesto.

Por lo general, cuando veo datos como los suyos, busco daños en la memoria o evidencia que sugiera que la codificación que espero es diferente a aquella con la que se ingresaron los datos.

/Alano

Tuve el mismo problema con la basura extraña arrojada por Adobe en un volcado EXIF.Pasé una hora buscando una respuesta directa y probando numerosas sugerencias a medias que no funcionaron aquí.

Este hilo, más que la mayoría de los que he leído, estaba repleto de preguntas profundas e inquisitivas como "¿cómo llegó allí?", "¿y si alguien tiene este personaje en su nombre?", "¿estás seguro de que quieres romper con la internacionalización?".

Hubo algunas demostraciones impresionantes de erudición que plantearon cómo esta basura pudo haber llegado aquí y explicaron la evolución de los diversos esquemas de codificación de caracteres.La persona quería saber cómo eliminarlo, no cómo surgió o qué están haciendo las organizaciones de estándares, por muy interesante que pueda ser esta trivia.

Escribí un pequeño programa que me dio la respuesta correcta.En lugar de parafrasear el concepto principal, aquí está el programa completo, autónomo y funcional (al menos en mi sistema) y el resultado que utilicé para destruir la basura:

#!/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<

¡¡¡Es normal!!!

Otra sugerencia práctica y funcional que encontré:iconv -c -t ASCII < 6s-2014.1031-238246.halloween.exf.dif > exf.ascii.dif

Si String tiene alguna fecha no deseada, esto es bueno para eliminar esa fecha no deseada

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

     //OutputString having the following result 

Me está funcionando bien, gracias por mirar esta reseña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top