¿Cómo puedo detectar la codificación/página de códigos de un archivo de texto?

Resuelto GvS asked hace 16 años • 21 respuestas

En nuestra aplicación recibimos archivos de texto ( .txt, .csv, etc.) de diversas fuentes. Al leer, estos archivos a veces contienen basura, porque los archivos se crearon en una página de códigos diferente/desconocida.

¿Hay alguna manera de detectar (automáticamente) la página de códigos de un archivo de texto?

El detectEncodingFromByteOrderMarks, en el StreamReaderconstructor, funciona para UTF8 y otros archivos marcados Unicode, pero estoy buscando una manera de detectar páginas de códigos, como ibm850,.windows1252


Gracias por sus respuestas, esto es lo que he hecho.

Los archivos que recibimos son de usuarios finales, que no tienen ni idea de las páginas de códigos. Los receptores también son usuarios finales; a estas alturas esto es lo que saben sobre las páginas de códigos: las páginas de códigos existen y son molestas.

Solución:

  • Abra el archivo recibido en el Bloc de notas y observe un fragmento de texto confuso. Si alguien se llama François o algo así, con tu inteligencia humana puedes adivinarlo.
  • Creé una pequeña aplicación que el usuario puede usar para abrir el archivo e ingresar un texto que el usuario sabe que aparecerá en el archivo cuando se use la página de códigos correcta.
  • Recorra todas las páginas de códigos y muestre las que brindan una solución con el texto proporcionado por el usuario.
  • Si aparece más de una página de códigos, solicite al usuario que especifique más texto.
GvS avatar Sep 18 '08 15:09 GvS
Aceptado

No puede detectar la página de códigos, es necesario que se lo indiquen. Puedes analizar los bytes y adivinarlos, pero eso puede dar resultados extraños (a veces divertidos). No puedo encontrarlo ahora, pero estoy seguro de que se puede engañar al Bloc de notas para que muestre texto en inglés en chino.

De todos modos, esto es lo que necesita leer: El mínimo absoluto que todo desarrollador de software debe saber absolutamente y positivamente sobre Unicode y los conjuntos de caracteres (¡sin excusas!) .

Específicamente Joel dice:

El hecho más importante sobre las codificaciones

Si olvida por completo todo lo que acabo de explicar, recuerde un hecho extremadamente importante. No tiene sentido tener una cadena sin saber qué codificación utiliza. Ya no puedes esconder la cabeza en la arena y pretender que el texto "sin formato" es ASCII. No existe el texto sin formato.

Si tiene una cadena, en la memoria, en un archivo o en un mensaje de correo electrónico, debe saber en qué codificación está o no podrá interpretarla ni mostrarla a los usuarios correctamente.

JV. avatar Sep 18 '2008 08:09 JV.

Si busca detectar codificaciones que no sean UTF (es decir, sin BOM), básicamente debe recurrir a la heurística y al análisis estadístico del texto. Es posible que desee echar un vistazo al documento de Mozilla sobre detección universal de juegos de caracteres ( mismo enlace, con mejor formato a través de Wayback Machine ).

Tomer Gabel avatar Sep 18 '2008 08:09 Tomer Gabel

¿Has probado el puerto C# para Mozilla Universal Charset Detector?

Ejemplo de http://code.google.com/p/ude/

public static void Main(String[] args)
{
    string filename = args[0];
    using (FileStream fs = File.OpenRead(filename)) {
        Ude.CharsetDetector cdet = new Ude.CharsetDetector();
        cdet.Feed(fs);
        cdet.DataEnd();
        if (cdet.Charset != null) {
            Console.WriteLine("Charset: {0}, confidence: {1}", 
                 cdet.Charset, cdet.Confidence);
        } else {
            Console.WriteLine("Detection failed.");
        }
    }
}    
ITmeze avatar Jul 23 '2012 10:07 ITmeze

No puedes detectar la página de códigos.

Esto es claramente falso. Cada navegador web tiene algún tipo de detector de juegos de caracteres universal para manejar páginas que no tienen indicación alguna de codificación. Firefox tiene uno. Puedes descargar el código y ver cómo lo hace. Vea alguna documentación aquí . Básicamente, es una heurística, pero que funciona muy bien.

Con una cantidad razonable de texto, incluso es posible detectar el idioma.

Aquí hay otro que acabo de encontrar usando Google:

shoosh avatar Sep 18 '2008 09:09 shoosh

Sé que es muy tarde para esta pregunta y esta solución no atraerá a algunos (debido a su sesgo centrado en el inglés y su falta de pruebas estadísticas/empíricas), pero funcionó muy bien para mí, especialmente para procesar datos CSV cargados:

http://www.architectshack.com/TextFileEncodingDetector.ashx

Ventajas:

  • Detección de lista de materiales incorporada
  • Codificación predeterminada/de reserva personalizable
  • bastante confiable (en mi experiencia) para archivos basados ​​en Europa occidental que contienen algunos datos exóticos (por ejemplo, nombres franceses) con una mezcla de archivos de estilo UTF-8 y Latin-1, básicamente la mayor parte de los entornos de EE. UU. y Europa occidental.

Nota: Yo soy quien escribió esta clase, ¡así que obviamente tómala con cautela! :)

Tao avatar Apr 29 '2011 09:04 Tao