2009-03-08 40 views
5

Tengo un requisito en el que un cliente proporcionará un archivo para codificar ANSI, pero mi sistema solo puede leer correctamente un archivo en UNICODE. Entonces, ¿cómo abordo este problema? Sé que cuando "guardo como" el archivo en UNICODE codificado, el archivo se recoge. Es difícil hacer que el cliente cumpla con nuestra solicitud. Entonces, ¿puedo tener un programa por lotes para esta carpeta para convertir este archivo en UNICODE y luego retomar?Cómo convertir el archivo * .txt en Unicode

+1

Cuando dices 'Unicode', ¿te refieres a UTF8, UTF16, UTF32, o alguna otra representación? ¿Y cómo detectará el código fuente cuando no es Unicode? ¿En que plataforma Estas tu? –

+3

La mayoría de las personas piensan que UTF-32 = Unicode. Culpo a MS y sus opciones de "Guardar como" para que esta idea prevalezca entre las masas. Es triste ver a un desarrollador (que debería saber mejor) compartirlo. –

+0

MS usa principalmente UCS-2, no UTF-32. – flodin

Respuesta

5

recode podría hacer el trabajo.

17

iconv puede hacer eso:

Usage: iconv [OPTION...] [FILE...] 
Convert encoding of given files from one encoding to another. 

Input/Output format specification: 
    -f, --from-code=NAME  encoding of original text 
    -t, --to-code=NAME   encoding for output 

Information: 
    -l, --list     list all known coded character sets 

Output control: 
    -c       omit invalid characters from output 
    -o, --output=FILE   output file 
    -s, --silent    suppress warnings 
     --verbose    print progress information 

    -?, --help     Give this help list 
     --usage    Give a short usage message 
    -V, --version    Print program version 

Mandatory or optional arguments to long options are also mandatory or optional 
for any corresponding short options. 

For bug reporting instructions, please see: 
<http://www.gnu.org/software/libc/bugs.html>. 
4

También puede convertir fácilmente las codificaciones en Python:

inf = open("infile.txt") 
data = inf.read().decode("latin1") 
inf.close() 

outf = open("outfile.txt", "w") 
outf.write(data.encode("utf-8")) 
outf.close() 
3

he aquí una solución Powershell

$lines = gc "pathToFile" 
$lines | out-file -enconding Unicode 
11

Ni ANSI ni Unicode son codificaciones. Deberá conocer la página de códigos ANSI del archivo de entrada y el codificador Unicode ding (UTF8 o UTF16 - LE o BE) antes de que pueda usar una de las herramientas sugeridas (como iconv)

+0

Desearía poder votar esto más. Para la mayoría de los usuarios de Windows, "Unicode" significa UTF32. La mayoría de los idiomas de Europa occidental usan la página de códigos Latin1, por lo que la mayoría de la gente supone que esa codificación es "ANSI" (una vez más, culpo a MS por el uso de sus palabras en sus opciones de "Guardar como"). –

+0

Podríamos agregar que al buscar en Panel de control-> Configuración regional-> Opciones avanzadas se mostrarán las páginas de códigos ANSI que están instaladas y utilizadas. –

+3

En sistemas Windows, "Unicode" generalmente significa UTF-16. –

1

Recorrí algunas herramientas mencionadas anteriormente, muchas de ellas requieren línea de comando.

Encontré una manera mucho más fácil de convertir archivos en Windows.

  1. Instalar Notepad2 (http://www.flos-freeware.ch/). Es de código abierto y gratuito.

  2. Abrir el archivo tiene codificación ANSI,

  3. doble clic palabra "ANSI" en la parte inferior,

  4. Seleccione nueva codificación tales como "UTF-8"

  5. Guarde el archivo.

Solo hacen unos pocos clics para realizar el trabajo.

Además, puede revisar fácilmente el contenido una vez hecho para verificarlo dos veces.

Notepad2 tiene varias ventajas sobre el Bloc de notas. código resaltado, deshacer/rehacer, etc.

: D

+0

No veo cómo cambiar la codificación usando la GUI de Notepad2 es más fácil que usar la línea de comando, especialmente con múltiples archivos para hacer? – ehambright

+0

La interfaz gráfica de usuario no es pan comido: X Commandline necesita dependencia ... notepad ++ es solo hacer clic, haga clic en clic ... – CodeFarmer

0

Rubí oneliner, fwiw:

ruby -e 'STDOUT.write STDIN.read.force_encoding(Encoding::WINDOWS_1252).encode!(Encoding::UTF_8)' <infile.csv> outfile.csv 

Si el archivo de entrada es horrible lo que pueda necesitar tachuela STDIN.binmode; STDOUT.binmode; en la parte frontal del guión Ruby.

Cuestiones relacionadas