<0xEF, 0xBB, 0xBF> caractere aparecendo nos arquivos. Como removê-los?


86

Estou compactando arquivos JavaScript e o compressor está reclamando que meus arquivos têm caracteres.

Como posso pesquisar esses caracteres e removê-los?


16
Isso não é <U+FEFF>, esse é <0xEF,0xBB,0xBF>o BOM dos arquivos UTF8, então você deve alterar o título. Como você gostaria de removê-los? Por fadas mágicas? Por ferramenta de linha de comando? Editando um por um? O Notepad ++ pode alterar a codificação para UTF8 sem BOM. Por exemplo, pesquisando no Google 5 segundos de "strip BOM utf8", encontrei isso para Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
Pode ajudá-lo a obter uma resposta que se relaciona especificamente ao seu problema se você nos disser qual ferramenta javascript está usando para fazer a compactação, em qual plataforma e quais outras ferramentas fazem parte do seu processo de criação.
SingleNegationElimination

15
BOMs em UTF-8 são absolutamente crus. Você precisa encontrar o produtor desse arquivo e dizer a ele para cortá-lo @ # %%.
tchrist,

4
@peterflynn: U+FEFFé o ponto de código Unicode usado para um BOM, mas o próprio BOM é como esse ponto de código é codificado (UTF-8 0xEF 0xBB 0xBF:, UTF-16LE:, 0xFF 0xFEUTF-16BE:, 0xFE 0xFFetc). Portanto, os arquivos em questão são codificados em UTF-8, que o compressor detecta ao decodificá-los para pontos de código Unicode reais.
Remy Lebeau

4
@xanatos Independentemente do que seja, é assim que se manifesta, e é assim que as pessoas podem encontrar facilmente essa questão usando os motores de busca.
BartoszKP

Respostas:


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

Eu presumo que a ferramenta falhará se você tiver outro utf-8 em seus arquivos, mas se não tiver, talvez esta solução alternativa possa ajudá-lo. (Não testado ...)

Editar : adicionada a -CSDopção, conforme comentário do cristão.


1
Você precisa executar com o -CSDswitch, ou com o PERL_UNICODEenvariable definido como SD, para que funcione.
tchrist,

Regexp funciona bem para remover o caractere <fffe> no início de uma linha, para substituir todos os caracteres <fffe> em uma linha: 's / \ x {fffe} // g'.
Diego Pino

2
No Mac OSX, tive que mudar para perl -CSD -pe 's/^\x{feff}//' file.csv:, observe a mudança de <fffe> para <feff>.
mpettis de

1
@mpettis Isso não é um BOM então, mas um BOM com os bytes invertidos. Pode acontecer em qualquer plataforma, se você converter UTF-16 em UTF-8 e obter a ordem de bytes errada (mesmo que o objetivo do BOM seja evitar esse erro!)
tripleee

1
@blong O que tem? Faça uma pergunta separada se você não conseguir descobrir (mas provavelmente será marcada como uma duplicata; primeiro hit do google stackoverflow.com/questions/1712188/… )
tripleee

185

Você pode removê-los facilmente usando o vim . Aqui estão as etapas:

1) Em seu terminal, abra o arquivo usando o vim:

vim file_name

2) Remova todos os caracteres BOM :

:set nobomb

3) Salve o arquivo:

:wq

Essa solução funcionou para mim. É mais simples do que a resposta selecionada. Obrigado
szydan

Usei essa ótima solução, embora normalmente seja um partidário do emacs. vim ftw
Ellen Spertus

30

Outro método para remover esses caracteres - usando o Vim :

vim -b fileName

Agora, esses caracteres "ocultos" são visíveis ( <feff>) e podem ser removidos.


20

Obrigado pelas respostas anteriores, aqui está uma variante sed (1) para o caso de:

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

1
Outras fontes sugerem acrescentar a figura 1 ao padrão, como em "sed '1 s / \ xEF \ xBB \ xBF //'", para coincidir apenas com a primeira linha. No entanto, para mim no Mac OS X, nenhuma maneira funciona.
Marian,

1
Isso funcionou e foi a melhor solução para mim. Obrigado, senhor!
Vance Lucas de

1
Adorei essa solução. Mais fácil de implementar e ainda escalável ... :)
Piko

1
@Marian Um pouco tarde, mas você pode verificar a resposta de Masum que mostra por que não funcionou no mac.
Alguém ainda usa você MS-DOS

1
Adicione -i ao sed para atualizar o (s) arquivo (s) com as alterações.
Johan

17

Em Unix / Linux:

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

No MacOSX

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

Observe o $ após sed para mac.

No Windows

Existe Super Sed uma versão aprimorada do sed. Para o Windows, é um .exe autônomo, destinado à execução na linha de comando.


1
"Observe o $ após sed para mac." - Obrigado senhor!
Alguém ainda usa você MS-DOS

1
A string Bash "estilo C" $'\xEF\xBB\xBF//'é um recurso Bash, não particularmente um recurso Mac ou OSX. Com essa estrutura, o Bash analisará as sequências de escape em bytes reais antes de passar a linha de comando para sed. Dependendo da sua sedvariante, isso pode ou não funcionar (embora tenha certeza de que é útil para os usuários do OSX saber que deve funcionar fora da caixa para eles).
tripleee

1
talvez sed -i 's /.../.../'
Arthur

6

Usar cauda pode ser mais fácil:

tail --bytes=+4 filename > new_filename

1
Essa técnica falhará depois que o produtor do arquivo remover o BOM. Não escalável ... :)
Piko

4

A solução do @tripleee não funcionou para mim. Mas mudar a codificação do arquivo para ASCII e novamente para UTF-8 resolveu :-)


3

Eu usei o vimgrep para isso

:vim "[\uFEFF]" *

também comando de pesquisa normal do vim

/[\uFEFF]

2

O comando 'arquivo' mostra se o BOM está presente:

Por exemplo: 'file myfile.xml' exibe: "Documento XML 1.0, texto UTF-8 Unicode (com BOM), com linhas muito longas, com terminadores de linha CRLF"

dos2unix irá remover o BOM.



1

Em Sublime Text você pode instalar o pacote Highlighter e personalizar a expressão regular nas configurações do usuário.

Aqui eu adicionei \uFEFFao final da highlighter_regexpropriedade.

{
    "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 substituir as configurações do pacote padrão, coloque o arquivo aqui:

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


1

Sugiro o uso da ferramenta "dos2unix", teste para rodar dos2unix ./thefile.js.

Se necessário, tente usar algo assim para vários arquivos:

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

Meus cumprimentos.


1
Gostei da sua resposta - bomstripnão estava facilmente disponível no meu mac - então find . -type f -exec dos2unix '{}' +
dediquei algum

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.