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

Quintin Par
fuente
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.

tripleee
fuente
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
Mohammad Anini
fuente
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.

RUMANIA_engineer
fuente
20

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

sed '1s/^\xEF\xBB\xBF//'
Michael Shigorin
fuente
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.

Masum
fuente
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
Dzanvu
fuente
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ó :-)

Pablo Torrecilla
fuente
3

He usado vimgrep para esto

:vim "[\uFEFF]" *

también comando normal de búsqueda de vim

/[\uFEFF]
Olexiy Zamkoviy
fuente
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.

LittletonDoug
fuente
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

JJD
fuente
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.

Wellington 1993
fuente
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
0

Guarde el archivo sin firma de código.

Masood Moshref
fuente