2011-01-12 10 views
13

Estoy trabajando en una base de código que tiene algunos archivos codificados en Unicode dispersos a través de múltiples miembros del equipo que se desarrollan con diferentes editores (y configuraciones predeterminadas). Me gustaría limpiar nuestra base de códigos encontrando todos los archivos codificados en Unicode y convirtiéndolos de nuevo en codificación ANSI.¿Cuál es la mejor manera de identificar archivos de texto codificados en Unicode en Windows?

Cualquier idea sobre cómo lograr la parte de "búsqueda" de esta tarea sería realmente apreciada.

+0

¿Qué lenguaje de programación está utilizando? Supongo que un pequeño script VBS puede ser suficiente para esta tarea. – LostInTheCode

+0

Estamos usando C#, pero estaba buscando más una herramienta que pudiera usar para buscar archivos codificados en Unicode. ¿Qué buscarías en los archivos de texto para identificarlos como unicode? – HOCA

Respuesta

5

Ver “How to detect the character encoding of a text-file?” o “How to reliably guess the encoding [...]?”

  • UTF-8 se puede detectar con la validación. También puede buscar la BOM EF BB BF, pero no confíe en ella.
  • UTF-16 puede detectarse buscando la lista de materiales.
  • UTF-32 se puede detectar por validación o por la lista de materiales.
  • De lo contrario, asuma la página de códigos ANSI.

Nuestra base de código no incluye ninguna caracteres no ASCII. Intentaré grep para la lista de materiales en archivos en nuestra base de código. Gracias por la aclaración.

Bueno, eso hace que las cosas sean lote simpler. UTF-8 sin caracteres no ASCII es ASCII.

+0

¿qué quiere decir con "se puede detectar con validación"? ¿A qué tipo de validación se está refiriendo? ¡Gracias! – LearnByReading

+0

Me refiero a comprobar que los datos consisten únicamente en secuencias de bytes UTF-8 válidas. Por ejemplo, 'F0 9F 92 A9' es válido UTF-8, pero' F5 9F 92 A9' no lo es. – dan04

4

Unicode es un estándar, no es una codificación. Hay muchas codificaciones que implementan Unicode, incluidas UTF-8, UTF-16, UCS-2 y otras. La traducción de cualquiera de estas codificaciones a ASCII depende completamente de la codificación que utilicen sus "diferentes editores".

Algunos editores insertan marcas de orden de bytes de listas de materiales al comienzo de los archivos Unicode. Si sus editores hacen eso, puede usarlos para detectar la codificación.

ANSI es un cuerpo de estándares que ha publicado varias codificaciones para datos de caracteres digitales. La codificación "ANSI" utilizada por MS DOS y compatible con Windows es en realidad CP-1252, no es un estándar ANSI.

¿Su base de código incluye caracteres no ASCII? Puede tener una mejor compatibilidad con una codificación Unicode en lugar de ANSI one o CP-1252.

+0

Nuestra base de código no incluye ningún carácter no ASCII. Voy a tratar de grep para la lista de materiales en los archivos en nuestra base de código. Gracias por la aclaración. – HOCA

+2

No hay una sola codificación de Windows 8 bits (también conocida como ANSI), hay muchas, como CP1251, CP1252, CP1253, etc. También vea esta pregunta: http://stackoverflow.com/questions/3864240/default-code-page-for-each-language-version-of-windows – dalle

+0

@HOCA, si sus archivos solo contienen ASCII, ya está en UTF -8 y no necesita "conversión". –

0

Es algo difícil de decir, pero comenzaría por buscar una lista de materiales. La mayoría de los programas de Windows que escriben archivos Unicode emiten listas de materiales.

Si estos archivos existen en su base de código probablemente compilan. Puede que se pregunte si realmente necesita hacer esta "limpieza". Si necesita hacerlo, preguntaría cómo la cadena de herramientas que procesa estos archivos descubre su codificación. Si sabes eso, entonces podrás usar el mismo diagnóstico.

+0

Estamos viendo que el compilador de cierre de Google ignora los archivos JS que están codificados en UTF8, que es la razón de esta "limpieza". Supongo que grep'ing para BOM es probablemente la solución más barata aquí. – HOCA

+0

@HOCA ¿Cómo sabría el compilador de cierre de Google ignorar un archivo a menos que tuviera una lista de materiales? Apuesto a que estos archivos tienen listas de materiales y grep hará el trabajo. –

+0

@HOCA Bueno, grep los encontrará, pero es posible que desee utilizar un script Perl/Python/Ruby/lo que sea para convertirlos realmente, si hay muchos. –

1

Si está buscando una solución programática, IsTextUnicode() podría ser una opción.

+2

Esa función API es problemática: http://blogs.msdn.com/b/michkap/archive/2005/01/30/363308.aspx –

+0

Ni siquiera es compatible con UTF-8. – dan04

+0

Si bien no es perfecto, IsTextUnicode es exactamente lo que Notepad usa para diferenciar entre Unicode y ANSI/UTF8. Busca el encabezado BOM en un archivo. En su defecto, tiene algún algoritmo de inferencia estadística. Pero está solo para detectar entre ANSI y UTF8. – selbie

1

En realidad, si desea averiguar en Windows si un archivo es unicode, simplemente ejecute findstr en el archivo para encontrar una cadena que sepa que está allí.

findstr/I/C: archivo "SomeKnownString".txt

Volverá vacío. A continuación, para estar seguro, findstr funcionar con una letra o dígito que usted conoce está en el archivo:

findstr/E/C: "P" archivo.txt

Probablemente obtendrá muchas ocurrencias y la clave es que estarán espaciados. Este es un signo de que el archivo es unicode y no ascii.

Espero que esto ayude.

Cuestiones relacionadas