<0xEF, 0xBB, 0xBF> carácter que aparece en los archivos. ¿Cómo eliminarlos?


86

Estoy comprimiendo archivos JavaScript y el compresor se queja de que mis archivos tienen carácter.

¿Cómo puedo buscar estos personajes y eliminarlos?


16
Eso no es <U+FEFF>, es decir, <0xEF,0xBB,0xBF>esa es la lista de materiales de los archivos UTF8, por lo que debe cambiar el título. ¿Cómo le gustaría eliminarlos? ¿Por hadas mágicas? ¿Con la herramienta de línea de comandos? ¿Editando uno por uno? Notepad ++ puede cambiar la codificación a UTF8 sin BOM. Por ejemplo, simplemente buscando en Google 5 segundos de "strip BOM utf8". He encontrado esto para Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
Podría ayudarlo a obtener una respuesta que se relacione específicamente con su problema si nos dice qué herramienta de JavaScript está utilizando para realizar la compresión, en qué plataforma y qué otras herramientas son parte de su proceso de compilación.
SingleNegationElimination

15
Las listas de materiales en UTF-8 son absolutamente basura. Necesita encontrar al productor de ese archivo y decirle que lo elimine @ # %%.
tchrist

4
@peterflynn: U+FEFFes el punto de código Unicode que se usa para una lista de materiales, pero la lista de materiales en sí es cómo se codifica ese punto de código (UTF-8:, 0xEF 0xBB 0xBFUTF-16LE:, 0xFF 0xFEUTF-16BE:, 0xFE 0xFFetc.). Entonces, los archivos en cuestión están codificados en UTF-8, que el compresor detecta al decodificarlos en puntos de código Unicode reales.
Remy Lebeau

4
@xanatos Independientemente de lo que sea, así es como se manifiesta, y así es como la gente puede encontrar fácilmente esta pregunta usando los motores de búsqueda.
BartoszKP

Respuestas:


18
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

Asumiría que la herramienta se romperá si tiene otro utf-8 en sus archivos, pero si no, tal vez esta solución pueda ayudarlo. (Sin probar ...)

Editar : agregó la -CSDopción, según el comentario de tchrist.


1
Debe ejecutar con el -CSDinterruptor, o con el PERL_UNICODEenvariable configurado en SD, para que eso funcione.
tchrist

Regexp funciona bien para eliminar el carácter <fffe> al principio de una línea, para reemplazar todos los caracteres <fffe> en una línea: 's / \ x {fffe} // g'.
Diego Pino

2
En Mac OSX, tuve que cambiar a:, perl -CSD -pe 's/^\x{feff}//' file.csvobserve el cambio de <fffe> a <feff>.
mpettis

1
@mpettis Entonces, eso no es una lista de materiales, sino una lista de materiales con los bytes invertidos. Podría suceder en cualquier plataforma, si convierte UTF-16 a UTF-8 y obtiene un orden de bytes incorrecto (¡aunque el propósito de la lista de materiales es evitar ese error!)
tripleee

1
@blong ¿Qué pasa con eso? Haga una pregunta por separado si no puede resolverlo (pero probablemente se marcará como un duplicado; primer
acceso de

185

Puede eliminarlos fácilmente usando vim , estos son los pasos:

1) En su terminal, abra el archivo usando vim:

vim file_name

2) Elimine todos los caracteres BOM :

:set nobomb

3) Guarde el archivo:

:wq

Esta solución funcionó para mí. Es más simple que la respuesta seleccionada. Gracias
szydan

Usé esta gran solución a pesar de que normalmente soy un partidario de emacs. vim ftw
Ellen Spertus

30

Otro método para eliminar esos caracteres, usando Vim :

vim -b nombreArchivo

Ahora esos caracteres "ocultos" son visibles ( <feff>) y pueden eliminarse.


20

Gracias por las respuestas anteriores, aquí hay una variante sed (1) por si acaso:

sed '1s/^\xEF\xBB\xBF//'

1
Otras fuentes sugieren anteponer la figura 1 al patrón, como en "sed '1 s / \ xEF \ xBB \ xBF //'", para que solo coincida con la primera línea. Sin embargo, para mí en Mac OS X, ninguna de las dos formas funciona.
Marian

1
Esto funcionó y fue la mejor solución para mí. ¡Gracias Señor!
Vance Lucas

1
Me encantó esta solución. Más fácil de implementar y aún escalable ... :)
Piko

1
@Marian Un poco tarde, pero puede verificar la respuesta de Masum que muestra por qué no funcionó en Mac.
Alguien todavía te usa MS-DOS

1
Agregue -i a sed para actualizar los archivos con los cambios.
Johan

17

En Unix / Linux:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

En MacOSX

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

Observe el $ después de sed para mac.

En Windows

Hay Super Sed, una versión mejorada de sed. Para Windows, este es un .exe independiente, diseñado para ejecutarse desde la línea de comandos.


1
"Observe el $ después de sed para mac". - ¡Gracias Señor!
Alguien todavía te usa MS-DOS

1
La cadena Bash "estilo C" $'\xEF\xBB\xBF//'es una característica de Bash, no particularmente una característica de Mac o OSX. Con esta construcción, Bash analizará las secuencias de escape en bytes reales antes de pasar la línea de comando a sed. Dependiendo de su sedvariante, esto puede funcionar o no (aunque estoy seguro de que es útil para los usuarios de OSX saber que debería funcionar para ellos).
tripleee

1
Quizás sed -i 's /.../.../'
Arthur

6

Usar la cola podría ser más fácil:

tail --bytes=+4 filename > new_filename

1
Esta técnica fallaría después de que el productor del archivo elimine la lista de materiales. No escalable ... :)
Piko

4

La solución de @ tripleee no funcionó para mí. Pero cambiar la codificación del archivo a ASCII y nuevamente a UTF-8 funcionó :-)


3

He usado vimgrep para esto

:vim "[\uFEFF]" *

también comando normal de búsqueda de vim

/[\uFEFF]

2

El comando 'archivo' muestra si la lista de materiales está presente:

Por ejemplo: 'file myfile.xml' muestra: "Documento XML 1.0, texto Unicode UTF-8 (con BOM), con líneas muy largas, con terminadores de línea CRLF"

dos2unix eliminará la lista de materiales.



1

En Sublime Text puedes instalar el paquete Highlighter y luego personalizar la expresión regular en su configuración de usuario.

Aquí agregué \uFEFFal final de la highlighter_regexpropiedad.

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

Para sobrescribir la configuración predeterminada del paquete, coloque el archivo aquí:

~ / .config / sublime-text-3 / Packages / User / highlighter.sublime-settings


1

Sugiero el uso de la herramienta "dos2unix", pruébelo para ejecutarlo dos2unix ./thefile.js.

Si es necesario, intente usar algo como esto para varios archivos:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

Mis saludos.


1
Me gustó tu respuesta, bomstripno estaba disponible fácilmente en mi mac, así que me tomé el tiempo para darte la versión simple:find . -type f -exec dos2unix '{}' +
dsz

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.