without sublime convertir charset caracteres bom archivos utf-8 batch-file scripting byte-order-mark

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? )



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.