sublime - utf-8 encoding
Agregar BOM a archivos UTF-8 (6)
Estoy buscando (sin éxito) una secuencia de comandos, que funcionaría como un archivo por lotes y me permitiría anteponer un archivo de texto UTF-8 con una lista de materiales si no tiene uno. Ni el lenguaje en el que está escrito (perl, python, c, bash) ni el SO en el que trabaja me importa. Tengo acceso a una amplia gama de computadoras.
He encontrado una gran cantidad de secuencias de comandos para hacer lo contrario (quitar la lista de materiales), lo que me suena bastante tonto, ya que muchos programas de Windows tendrán problemas para leer archivos de texto UTF-8 si no tienen una lista de materiales.
¿Extrañé lo obvio? ¡Gracias!
(Respuesta basada en https://.com/a/9815107/1260896 por yingted)
Para agregar listas de materiales a todos los archivos que comienzan con "foo-", puede usar sed
. sed
tiene una opción para hacer una copia de seguridad.
sed -i ''1s/^/(/xef/xbb/xbf/)/?//xef/xbb/xbf/'' foo-*
Si está seguro de que ya no hay BOM, puede simplificar el comando:
sed -i ''1s/^//xef/xbb/xbf/'' foo-*
Asegúrese de que necesita establecer UTF-8, porque es decir, UTF-16 es diferente (de lo contrario, verifique ¿Cómo puedo volver a agregar un marcador de orden de bytes unicode en Linux? )
Creé un guión basado en el código de . https://github.com/Vdragon/addUTF-8bomb
Consulte https://github.com/Vdragon/C_CPP_project_template/blob/development/Tools/convertSourceCodeToUTF-8withBOM.bash.sh por ejemplo, para usar este script.
Escribí este addbom.sh usando el comando ''file'' y el comando ''uconv'' de ICU.
#!/bin/sh
if [ $# -eq 0 ]
then
echo usage $0 files ...
exit 1
fi
for file in "$@"
do
echo "# Processing: $file" 1>&2
if [ ! -f "$file" ]
then
echo Not a file: "$file" 1>&2
exit 1
fi
TYPE=`file - < "$file" | cut -d: -f2`
if echo "$TYPE" | grep -q ''(with BOM)''
then
echo "# $file already has BOM, skipping." 1>&2
else
( mv "${file}" "${file}"~ && uconv -f utf-8 -t utf-8 --add-signature < "${file}~" > "${file}" ) || ( echo Error processing "$file" 1>&2 ; exit 1)
fi
done
editar: citas añadidas alrededor de los argumentos mv
. Gracias @DirkR y me alegro de que este script haya sido tan útil.
La forma más fácil que encontré para esto es
#!/usr/bin/env bash
#Add BOM to the new file
printf ''/xEF/xBB/xBF'' > with_bom.txt
# Append the content of the source file to the new file
cat source_file.txt >> with_bom.txt
Sé que usa un programa externo (cat) ... pero hará el trabajo fácilmente en bash
Probado en osx, pero también debería funcionar en Linux
TEN EN CUENTA que asume que el archivo no tiene BOM (!)
Lo encuentro bastante simple. Suponiendo que el archivo siempre es UTF-8 (no está detectando la codificación, usted conoce la codificación):
Lee los primeros tres caracteres. Compárelos con la secuencia de BOM UTF-8 (wikipedia dice que es 0xEF, 0xBB, 0xBF). Si es igual, imprímalos en el nuevo archivo y luego copie todo lo demás desde el archivo original al nuevo. Si es diferente, primero imprima la lista de materiales, luego imprima los tres caracteres y solo luego imprima todo lo demás desde el archivo original al nuevo.
En C, fopen / fclose / fread / fwrite debería ser suficiente.
Pensé que no tendría que escribir algo tan trivial, pero como también necesitaba hacer una conversión de juego de caracteres, aquí está:
#!/usr/bin/python
import os
import sys
import codecs
INPUT_ENCODING = codecs.BOM_UTF16_LE # ''utf_16_le''
OUTPUT_ENCODING = ''utf-8-sig'' # is there a constant for this??
if len(sys.argv) == 1:
print ''Usage:/n/t%s <filename.txt>'' % sys.argv[0]
sys.exit(-1)
output_file = os.path.splitext(os.path.split(sys.argv[1])[-1])[0]
fin = codecs.open(sys.argv[1], ''rb'', encoding=INPUT_ENCODING)
fout = codecs.open(output_file + ''_utf8bom.txt'', ''wb'', encoding=OUTPUT_ENCODING)
fout.write(fin.read())
fin.close()
fout.close()
print ''done''
Llámalo solo con el nombre original del archivo, es decir:
# utf8bom_add.py myfilename.txt
Y si está convirtiendo UTF-8
a UTF-8
, cambie INPUT_ENCODING
al valor correcto.