Como faço para remover ï »¿do início de um arquivo?


145

Eu tenho um arquivo CSS que fica bem quando o abro usando o gedit , mas quando é lido pelo PHP (para mesclar todos os arquivos CSS em um), esse CSS tem os seguintes caracteres anexados: ï »¿

O PHP remove todo o espaço em branco; portanto, um ï »¿aleatório no meio do código atrapalha a coisa toda. Como mencionei, não consigo ver esses caracteres quando abro o arquivo no gedit, portanto não consigo removê-los com muita facilidade.

Pesquisei o problema no Google e há claramente algo errado com a codificação de arquivos, o que faz sentido, pois tenho transferido os arquivos para diferentes servidores Linux / Windows via ftp e rsync , com diversos editores de texto. Eu realmente não sei muito sobre codificação de caracteres, então a ajuda seria apreciada.

Se ajudar, o arquivo está sendo salvo no formato UTF-8 e o gedit não permitirá que eu o salve no formato ISO-8859-15 (o documento contém um ou mais caracteres que não podem ser codificados usando a codificação de caracteres especificada). Tentei salvá-lo com finais de linha do Windows e Linux, mas nenhum deles ajudou.


Isso parece resolver o problema. 95isalive.com/expression/index.html

30
Alguém nos tira da lista técnica
David Heffernan 5/11

Respostas:


150

Três palavras para você:

Marca de Pedido de Byte (BOM)

Essa é a representação para a BOM UTF-8 na ISO-8859-1. Você precisa dizer ao seu editor para não usar BOMs ou usar um editor diferente para removê-las.

Para automatizar a remoção da lista técnica, você pode usar awkcomo mostrado nesta pergunta .

Como outra resposta diz , o melhor seria o PHP realmente interpretar a lista técnica corretamente, para que você possa usar mb_internal_encoding()assim:

 <?php
   //Storing the previous encoding in case you have some other piece 
   //of code sensitive to encoding and counting on the default value.      
   $previous_encoding = mb_internal_encoding();

   //Set the encoding to UTF-8, so when reading files it ignores the BOM       
   mb_internal_encoding('UTF-8');

   //Process the CSS files...

   //Finally, return to the previous encoding
   mb_internal_encoding($previous_encoding);

   //Rest of the code...
  ?>

Sim, descobri que quando pesquisei no Google, mas como removê-los?
Matt

10
Não remove a lista técnica, ignora-a.
Cole Johnson

Ou o contrário (ignorar) pode ser alterar a codificação.
Mr5

O bloco de notas do Windows (ugh) os adiciona; A sugestão de um dup desta pergunta é usar o Notepad ++, que permite definir "UTF-8 sem BOM" como uma codificação. Ou usar um editor Real ... :-) (emacs!)
jesup

2
Esse é exatamente o problema: codificações de caracteres diferentes usam bytes diferentes para os mesmos caracteres. Leia novamente o terceiro parágrafo da resposta.
Vinko Vrsalovic

24

Abra seu arquivo no Notepad ++ . No menu Codificação , selecione Converter em UTF-8 sem BOM , salve o arquivo, substitua o arquivo antigo por esse novo arquivo. E vai funcionar, com certeza.


1
No Notepad ++ v7.6.6 (64 bits), você precisa clicar em Converter em UTF-8 .
stomy

23

No PHP , você pode fazer o seguinte para remover todos os caracteres não incluindo o caractere em questão.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);

1
caso você queira apenas matar o "ï", use este $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Você adiciona um extra /, ele deve ser:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ 16/07/19

20

Para aqueles com acesso ao shell, aqui está um pequeno comando para encontrar todos os arquivos com a BOM definida no diretório public_html - certifique-se de alterá-lo para o seu caminho correto no servidor

Código:

grep -rl $'\xEF\xBB\xBF' /home/username/public_html

e se você estiver confortável com o editor vi , abra o arquivo no vi:

vi /path-to-file-name/file.php

E digite o comando para remover a BOM:

set nobomb

Salve o arquivo:

wq

1
Use grep -rlI $'\xEF\xBB\xBF' .para ignorar arquivos binários.
Nabi KAZ

11

A BOM é apenas uma sequência de caracteres ($ EF $ BB $ BF para UTF-8); portanto, remova-os usando scripts ou configure o editor para que não seja adicionado.

Da remoção da lista técnica do UTF-8 :

#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);

Tenho certeza de que ele se traduz em PHP facilmente.


6
Observe que a lista técnica não é uma sequência de caracteres, é um único caractere. Se o arquivo estiver em UTF-8, o caractere será representado em três bytes . Se o arquivo estiver em UTF-8, visualizá-lo em outra codificação (por exemplo, uma na qual EF BB BF aparece onde a BOM deve estar) é um erro. Para remover a lista técnica de um arquivo UTF-8, remova o (único) charcter U + FEFF. Sim, pediatria!
precisa

1
Não consegui fazer isso funcionar em PHP (isso é apenas minha incompetência, não a sua: P), então fiz uma verificação para ver se a lista técnica está lá e removi os 3 primeiros caracteres. Aqui está o código, se alguém precisar: if (substr ($ css, 0,3) == pacote ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
traduz para php como $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. Antes de usar isso, reconsidere se você não pode corrigir o problema na fonte.
comumpike 6/10/11

6

Para mim, isso funcionou:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Se eu remover essa meta, o ï »¿aparece novamente. Espero que isso ajude alguém ...


5

Eu não sei PHP, então não sei se isso é possível, mas a melhor solução seria ler o arquivo como UTF-8 em vez de alguma outra codificação. A BOM é na verdade um ZERO LARGURA SEM ESPAÇO DE QUEBRA. Esse é um espaço em branco; portanto, se o arquivo estiver sendo lido na codificação correta (UTF-8), a BOM será interpretada como espaço em branco e será ignorada no arquivo CSS resultante.

Além disso, outra vantagem de ler o arquivo na codificação correta é que você não precisa se preocupar com a má interpretação dos caracteres. Seu editor está lhe dizendo que a página de código em que você deseja salvá-la não terá todos os caracteres necessários. Se o PHP estiver lendo o arquivo na codificação incorreta, é muito provável que outros caracteres além da lista técnica estejam sendo silenciosamente mal interpretados. Use UTF-8 em todos os lugares e esses problemas desaparecem.


3

Você pode usar

vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'

Substituir por awk parece funcionar, mas não está no lugar.


2

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | definir nobomb | wq '


Use grep -rlI $'\xEF\xBB\xBF' .para ignorar arquivos binários. E também .melhor do que *aqui.
Nabi KAZ

2

Eu tive o mesmo problema com a lista técnica aparecendo em alguns dos meus arquivos PHP (ï »¿ï» ¿).

Se você usa o PhpStorm, pode definir a tecla de atalho para removê-lo em Configurações -> Configurações do IDE -> Mapa de teclas -> Menu principal -> Arquivo -> Remover BOM.



2

Abra o arquivo PHP em questão, no Notepad ++.

Clique em Codificação na parte superior e altere de "Codificação em UTF-8 sem BOM" para apenas "Codificação em UTF-8". Salve e substitua o arquivo no seu servidor.


1

Mesmo problema, solução diferente.

Uma linha no arquivo PHP estava imprimindo cabeçalhos XML (que usam as mesmas tags de início / fim que o PHP). Parece que o código nessas tags definiu a codificação e foi executado no PHP, o que resultou em caracteres estranhos. De qualquer maneira, aqui está a solução:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

Se você precisar remover a BOM dos arquivos codificados em UTF-8, primeiro precisará se apossar de um editor que esteja ciente deles.

Eu pessoalmente uso o Editor de Texto E .

No canto inferior direito, existem opções para codificação de caracteres, incluindo a tag BOM. Carregue seu arquivo, desmarque Byte Order Marker, se estiver selecionado, salve novamente e deve ser feito.

Texto alternativo http://oth4.com/encoding.png

O E não é gratuito, mas há uma avaliação gratuita e é um excelente editor ( compatibilidade limitada com o TextMate ).


1
O link da imagem está quebrado.
Peter Mortensen

1

Você pode abri-lo pelo PhpStorm e clicar com o botão direito do mouse no seu arquivo e clicar em Remover BOM ...


1

Aqui está outra boa solução para o problema com a lista técnica. Estes são dois scripts VBScript (.vbs).

Um para localizar a BOM em um arquivo e um para MATAR a BOM condenada no arquivo. Funciona muito bem e é fácil de usar.

Basta criar um arquivo .vbs e cole o seguinte código nele.

Você pode usar o script VBScript simplesmente arrastando e soltando o arquivo suspeito no arquivo .vbs. Ele informará se existe uma lista técnica ou não.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' find_BOM.vbs
' ====================
' Kleines Hilfsmittel, welches das BOM finden soll
'
 Const UTF8_BOM = ""
 Const UTF16BE_BOM = "þÿ"
 Const UTF16LE_BOM = "ÿþ"
 Const ForReading = 1
 Const ForWriting = 2
 Dim fso
 Set fso = WScript.CreateObject("Scripting.FileSystemObject")
 Dim f
 f = WScript.Arguments.Item(0)
 Dim t
 t = fso.OpenTextFile(f, ForReading).ReadAll
 If Left(t, 3) = UTF8_BOM Then
     MsgBox "UTF-8-BOM detected!"
 ElseIf Left(t, 2) = UTF16BE_BOM Then
     MsgBox "UTF-16-BOM (Big Endian) detected!"
 ElseIf Left(t, 2) = UTF16LE_BOM Then
     MsgBox "UTF-16-BOM (Little Endian) detected!"
 Else
     MsgBox "No BOM detected!"
 End If

Se indicar que existe uma lista técnica, crie o segundo arquivo .vbs com o código a seguir e arraste o arquivo suspeito para o arquivo .vbs.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' kill_BOM.vbs
' ====================
' Kleines Hilfmittel, welches das gefundene BOM löschen soll
'
Const UTF8_BOM = ""
Const ForReading = 1
Const ForWriting = 2
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Dim f
f = WScript.Arguments.Item(0)
Dim t
t = fso.OpenTextFile(f, ForReading).ReadAll
If Left(t, 3) = UTF8_BOM Then
    fso.OpenTextFile(f, ForWriting).Write (Mid(t, 4))
    MsgBox "BOM gelöscht!"
Else
    MsgBox "Kein UTF-8-BOM vorhanden!"
End If

O código é de Heiko Jendreck .


1

No PHPStorm, para vários arquivos e BOM, não necessariamente no início do arquivo, você pode pesquisar \x{FEFF}(Expressão regular) e substituir por nada.


0

Mesmo problema, mas ele afetou apenas um arquivo, então eu apenas criei um arquivo em branco, copiei / colei o código do arquivo original para o novo arquivo e substituí o arquivo original. Não é chique, mas funcionou.


0

Use o Total Commander para procurar todos os arquivos de BOM:

Maneira elegante de procurar arquivos UTF-8 com BOM?

  • Abra esses arquivos em algum editor adequado (que reconheça a BOM) como o Eclipse .

  • Altere a codificação do arquivo para ISO (clique com o botão direito do mouse em propriedades).

  • Corte ï »¿desde o início do arquivo, salve

  • Mude a codificação do arquivo de volta para UTF-8

... e nem pense em usar n ... d novamente!


0

Eu tive o mesmo problema. O problema foi porque um dos meus arquivos php estava no utf-8 (o mais importante, o arquivo de configuração que está incluído em todos os arquivos php).

No meu caso, eu tinha 2 soluções diferentes que funcionaram para mim:

Primeiro, alterei a configuração do Apache usando AddDefaultCharsetDirective nos arquivos de configuração (ou no arquivo .htaccess). Essa solução força o Apache a usar a codificação correta.

AddDefaultCharset ISO-8859-1

A segunda solução foi alterar a codificação incorreta do arquivo php.


0
  1. Copie o texto do seu arquivo filename.css.
  2. Feche o seu arquivo css.
  3. Renomeie-o filename2.css para evitar um conflito de nome de arquivo.
  4. No MS Notepad ou Wordpad, crie um novo arquivo.
  5. Cole o texto nele.
  6. Salve-o como filename.css, selecionando UTF-8 nas opções de codificação.
  7. Faça o upload do nome do arquivo.css.

-3

Verifique index.php, encontre "... charset=iso-8859-1" e substitua-o por "... charset=utf-8".

Talvez funcione.

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.