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: