utf8 unidades una texto secuencia representa example como codigo codificar caracteres acentos c# encoding character-encoding

unidades - encoding utf-8 c#



Detectar símbolos especiales en c# (2)

Estoy trabajando en el proyecto de CA # en el que algunos datos contienen caracteres que no son reconocidos por la codificación. Se muestran así:

"Algunos textos con símbolos especiales".

No tengo control sobre el proceso de codificación, también los datos provienen de archivos de diversos orígenes y diversos formatos. Quiero poder marcar los datos que contienen dichos caracteres como erróneos o incompletos. Ahora mismo puedo detectarlos de esta manera:

if(myString.Contains("�")) { //Do stuff }

Mientras funciona, no se siente bien utilizar el símbolo extraño directamente en la función Contiene. ¿No hay una manera más limpia de hacer esto?

EDITAR:

Después de consultar con el equipo responsable de leer los archivos, así es como lo hacen:

var sr = new StreamReader(filePath, true); var content = sr.ReadToEnd();

Se supone que pasar como un segundo parámetro de StreamReader detecta la codificación de la lista de materiales del archivo y la usa para leer el contenido. Sin embargo, no siempre funciona, ya que algunos archivos no contienen esa información, por lo que sus datos se leen de manera incorrecta.

Hemos realizado algunas pruebas y, en su lugar, el uso de StreamReader(filePath, Encoding.Default) parece funcionar para la mayoría, si no para todos, los archivos con los que tuvimos problemas. Es de esperar que los archivos que estaban trabajando antes ya no funcionen porque no usan la codificación predeterminada.

Entonces, la mejor solución para nosotros sería hacer lo siguiente: leer el archivo tratando de detectar su codificación, luego, si no fue exitoso, leerlo nuevamente con la codificación predeterminada.

El problema sigue siendo el mismo: ¿cómo verificamos, después de tratar de detectar la codificación del archivo, si los datos se han leído incorrectamente?


El carácter is no es un símbolo especial. Es el personaje de reemplazo de Unicode. Esto significa que el código intentó convertir texto ASCII utilizando la página de códigos incorrecta. Todos los caracteres que no tienen una coincidencia en la página de códigos fueron reemplazados por .

La solución es leer el archivo usando la codificación correcta. La codificación predeterminada utilizada por los métodos de File o StreamReader es UTF8. Puede pasar una codificación diferente utilizando el constructor apropiado, por ejemplo StreamReader(Stream, Encoding, Boolean) . Para usar la página de códigos de la configuración regional del sistema, debe utilizar Encoding.Default :

var sr = new StreamReader(filePath,Encoding.Default);

Puede usar el constructor StreamReader (Stream, Encoding, Boolean) para detectar automáticamente las codificaciones Unicode desde la BOM y recurrir a una codificación diferente.

Suponiendo que los archivos son algún tipo de Unicode o coinciden con la configuración regional del sistema, puede usar:

var sr = new StreamReader(filePath,Encoding.Default, true);

Desde la fuente de StreamReader se muestra que el método DetectEncoding verificará los primeros bytes de un archivo para determinar la codificación. Si se encuentra uno, se usa en lugar de la codificación suministrada. La operación no causa IO adicional porque el método verifica el buffer interno de la clase


EDITAR

Me acabo de dar cuenta de que realmente no se puede cargar el archivo sin formato en una cadena .NET y aún así poder tener información completa sobre el archivo original.

El proyecto aquí usa la API Mlang que hace un mejor trabajo al no cargar el archivo en una cadena .NET antes de adivinar. También hay una pregunta relacionada