txt texto saber online formato convertir como codificacion cambiar bom archivos archivo unix command-line character-encoding sublimetext line-endings

texto - ¿Cómo puedo asegurarme de que todos mis archivos fuente permanezcan UTF-8 con terminaciones de línea Unix?



convertir texto a utf-8 online (3)

Estoy buscando algunas herramientas de línea de comandos para Linux que puedan ayudarme a detectar y convertir archivos de conjuntos de caracteres como iso-8859-1 y windows-1252 a utf-8 y de terminaciones de línea de Windows a terminaciones de línea Unix.

La razón por la que necesito esto es porque estoy trabajando en proyectos en servidores Linux a través de SFTP con editores en Windows (como Sublime Text) que constantemente arruinan estas cosas. En este momento, supongo que la mitad de mis archivos son utf-8 , el resto son iso-8859-1 y Windows-1252, ya que parece Sublime Text simplemente selecciona el juego de caracteres por qué símbolos contiene el archivo cuando lo guardo. Los finales de línea son SIEMPRE terminaciones de línea de Windows a pesar de que he especificado en las opciones que las terminaciones de línea predeterminadas son LF , por lo que aproximadamente la mitad de mis archivos tienen LF y la otra mitad son CRLF .

Así que necesitaría al menos una herramienta que escanearía de forma recursiva la carpeta de mi proyecto y me alertaría de los archivos que se desvían de utf-8 con terminaciones de líneas LF para poder corregirlos manualmente antes de comprometer mis cambios a GIT.

Cualquier comentario y experiencia personal sobre el tema también sería bienvenido.

Gracias

Editar: Tengo una solución temporal en el lugar donde uso el tree y el file para generar información sobre cada archivo en mi proyecto, pero es un poco inestable. Si no -i opción -i para el file , muchos de mis archivos obtienen resultados diferentes, como el texto del programa ASCII C ++ y el texto del documento HTML y el texto en inglés, etc.

$ tree -f -i -a -I node_modules --noreport -n | xargs file | grep -v directory ./config.json: ASCII C++ program text ./debugserver.sh: ASCII text ./.gitignore: ASCII text, with no line terminators ./lib/config.js: ASCII text ./lib/database.js: ASCII text ./lib/get_input.js: ASCII text ./lib/models/stream.js: ASCII English text ./lib/serverconfig.js: ASCII text ./lib/server.js: ASCII text ./package.json: ASCII text ./public/index.html: HTML document text ./src/config.coffee: ASCII English text ./src/database.coffee: ASCII English text ./src/get_input.coffee: ASCII English text, with CRLF line terminators ./src/jtv.coffee: ASCII English text ./src/models/stream.coffee: ASCII English text ./src/server.coffee: ASCII text ./src/serverconfig.coffee: ASCII text ./testserver.sh: ASCII text ./vendor/minify.json.js: ASCII C++ program text, with CRLF line terminators

Pero si -i no me muestra los terminadores de línea:

$ tree -f -i -a -I node_modules --noreport -n | xargs file -i | grep -v directory ./config.json: text/x-c++; charset=us-ascii ./debugserver.sh: text/plain; charset=us-ascii ./.gitignore: text/plain; charset=us-ascii ./lib/config.js: text/plain; charset=us-ascii ./lib/database.js: text/plain; charset=us-ascii ./lib/get_input.js: text/plain; charset=us-ascii ./lib/models/stream.js: text/plain; charset=us-ascii ./lib/serverconfig.js: text/plain; charset=us-ascii ./lib/server.js: text/plain; charset=us-ascii ./package.json: text/plain; charset=us-ascii ./public/index.html: text/html; charset=us-ascii ./src/config.coffee: text/plain; charset=us-ascii ./src/database.coffee: text/plain; charset=us-ascii ./src/get_input.coffee: text/plain; charset=us-ascii ./src/jtv.coffee: text/plain; charset=us-ascii ./src/models/stream.coffee: text/plain; charset=us-ascii ./src/server.coffee: text/plain; charset=us-ascii ./src/serverconfig.coffee: text/plain; charset=us-ascii ./testserver.sh: text/plain; charset=us-ascii ./vendor/minify.json.js: text/x-c++; charset=us-ascii

¿Por qué también muestra charset = us-ascii y no utf-8 ? ¿Y qué es text / x-c ++ ? ¿Hay alguna manera de que solo produzca charset=utf-8 y line-terminators=LF para cada archivo?


Si un archivo no tiene BOM y no hay "caracteres interesantes" dentro de la cantidad de texto que ese file mira, el file concluye que es ASCII ISO-646: un subconjunto estricto de UTF-8. Puede encontrar que poner listas de materiales en todos sus archivos alienta a todas estas herramientas de Windows a comportarse; la convención de una BOM en un archivo UTF-8 originado en Windows. O podría empeorar las cosas. En cuanto a x / c ++, bueno, eso es solo file tratando de ser útil y fallar. Usted javascript tiene algo que se parece a C ++.

Apache Tika tiene un detector de codificación; incluso podría usar el controlador de línea de comandos que viene con él como alternativa al file . Se apegará a los tipos MIME y no vagará a C ++.


En lugar de file , intente con un programa personalizado para verificar solo las cosas que desea. Aquí hay un truco rápido, principalmente basado en algunos éxitos de Google, que fueron escritos accidentalmente por @ikegami.

#!/usr/bin/perl use strict; use warnings; use Encode qw( decode ); use vars (qw(@ARGV)); @ARGV > 0 or die "Usage: $0 files .../n"; for my $filename (@ARGV) { my $terminator = ''CRLF''; my $charset = ''UTF-8''; local $/; undef $/; my $file; if (open (F, "<", $filename)) { $file = <F>; close F; # Don''t print bogus data e.g. for directories unless (defined $file) { warn "$0: Skipping $filename: $!/n; next; } } else { warn "$0: Could not open $filename: $!/n"; next; } my $have_crlf = ($file =~ //r/n/); my $have_cr = ($file =~ //r(?!/n)/); my $have_lf = ($file =~ /(?!/r/n)./n/); my $sum = $have_crlf + $have_cr + $have_lf; if ($sum == 0) { $terminator = "no"; } elsif ($sum > 2) { $terminator = "mixed"; } elsif ($have_cr) { $terminator = "CR"; } elsif ($have_lf) { $terminator = "LF"; } $charset = ''ASCII'' unless ($file =~ /[^/000-/177]/); $charset = ''unknown'' unless eval { decode(''UTF-8'', $file, Encode::FB_CROAK); 1 }; print "$filename: charset $charset, $terminator line endings/n"; }

Tenga en cuenta que esto no tiene ningún concepto de codificaciones heredadas de 8 bits; simplemente lanzará unknown si no es ASCII puro de 7 bits ni el UTF-8 adecuado.


La solución con la que terminé son los dos complementos de Sublime Text 2 "EncodingHelper" y "LineEndings" . Ahora obtengo tanto la codificación del archivo como los finales de línea en la barra de estado:

Si la codificación es incorrecta, puedo Archivo-> Guardar con Codificación . Si las terminaciones de línea son incorrectas, el último complemento viene con comandos para cambiar los finales de línea: