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

Tenho um ficheiro CSS que parece bem quando o abro usando o gedit , mas quando é lido pelo PHP( para juntar todos os ficheiros CSS num só), este CSS tem os seguintes caracteres pré-adicionados: ï " ¿

O PHP remove todos os espaços em branco, por isso um aleatório no meio do Código estraga tudo. Como eu mencionei, eu não posso realmente ver esses personagens quando eu abrir o arquivo em gedit, então eu não posso removê-los muito facilmente.

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

Se ajudar, o ficheiro está a ser gravado no formato UTF-8, e o gedit não me deixa gravá-lo no formato ISO-8859-15 (o documento contém um ou mais caracteres que não podem ser codificados usando o especificado codificação de caracteres). Eu tentei salvá-lo com finais de linha Windows e Linux, mas nenhum ajudou.

Author: Peter Mortensen, 2010-07-15

22 answers

Três palavras para ti:

Marca de encomenda de bytes (BOM))

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

Para automatizar a remoção do BOM você pode usar awk Como mostrado em esta pergunta .

Como outra resposta diz, o melhor seria que o PHP interpreta o BOM corretamente, para que você pode usar mb_internal_encoding(), como isto:

 <?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...
  ?>
 124
Author: Vinko Vrsalovic, 2017-05-23 12:26:32

Em PHP , pode fazer o seguinte para remover todos os caracteres não incluídos, incluindo o carácter em questão.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
 21
Author: Michael Schreiber, 2015-05-09 17:00:24

Para aqueles com acesso à linha de comandos aqui está um pequeno comando para encontrar todos os ficheiros com o BOM definido no directório public_html - certifique-se de O alterar para qual é a sua localização correcta no seu servidor

Código:

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

E se estiver confortável com o editor vi, abra o ficheiro em vi:

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

E introduza o comando para remover o BOM:

set nobomb

Gravar o ficheiro:

wq
 19
Author: Diego Palomar, 2015-05-09 16:59:04

Abra o seu ficheiro em Notepad++. Do menu codificação , Seleccione converter para UTF-8 sem BOM , grave o ficheiro, substitua o ficheiro antigo por este novo ficheiro. E vai funcionar, com certeza.

 15
Author: V.Rohan, 2015-05-09 17:18:15

BOM é apenas uma sequência de caracteres ($EF $BB $bf para UTF-8), por isso basta removê-los usando scripts ou configurar o editor para que não seja adicionado.

De remover o BOM do UTF-8:

#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);
Tenho a certeza que se traduz facilmente em PHP.
 11
Author: Eugene Yokota, 2010-07-15 13:55:20
Para mim, isto funcionou.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Se eu remover este meta, ele volta a aparecer. Espero que isto ajude alguém...
 6
Author: NickWebman, 2014-11-12 18:53:33

Não conheço o PHP, por isso não sei se isto é possível, mas a melhor solução seria ler o ficheiro como UTF-8 em vez de outra codificação. O BOM é na verdade uma largura ZERO SEM espaço de ruptura. Este é o espaço em branco, então se o arquivo estava sendo lido na codificação correta (UTF-8), Então o BOM seria interpretado como espaço em branco e seria ignorado no arquivo CSS resultante.

Além disso, outra vantagem de ler o ficheiro na codificação correcta é que não é necessário preocupa-te com as personagens serem mal interpretadas. O seu editor está a dizer-lhe que a página de código em que o deseja gravar não fará todos os caracteres de que necessita. Se PHP está então lendo o arquivo na codificação incorreta, então é muito provável que outros caracteres além do BOM estão sendo silenciosamente mal interpretados. Use UTF-8 em todos os lugares, e esses problemas desaparecem.

 5
Author: Jeffrey L Whitledge, 2010-07-15 14:10:28

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.
 3
Author: till, 2015-05-09 16:56:01

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

 2
Author: Simone, 2013-11-29 14:13:23
Tive o mesmo problema com o BOM aparecer em alguns dos meus ficheiros PHP.

Se usar PhpStorm , poderá definir no hotkey para o Remover na configuração - > IDE configuração - > Keymap -> Menu Principal - > ficheiro - > remover BOM.

 2
Author: Toby, 2015-05-09 16:57:17

No Notepad++, escolha o menu "codificação" e, em seguida, "codificar em UTF-8 sem BOM". Salvar.

Ver a questão do excesso de fluxo da pilha Como fazer o bloco de notas para gravar o texto em UTF-8 sem BOM?.

 2
Author: Curtis Yallop, 2017-05-23 12:34:38

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

Carregue na codificação no topo e mude de " codificação em UTF-8 sem BOM "para"codificação em UTF-8". Gravar e sobrepor o ficheiro no seu servidor.

 2
Author: Problem Solved, 2015-10-21 06:55:54

O mesmo problema, solução diferente.

Uma Linha do ficheiro PHP estava a imprimir os cabeçalhos XML (que usam as mesmas marcas de início/fim que o PHP). Parece que o código dentro dessas tags define a codificação, e foi executado dentro do PHP o que resultou nos caracteres estranhos. Seja como for, 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
Author: D G, 2012-01-05 18:20:08

Se precisar de ser capaz de remover o BOM dos ficheiros codificados UTF-8, primeiro precisa de contactar um editor que esteja ciente deles.

Uso pessoalmente e Editor de texto .

No canto inferior direito, existem opções para codificação de caracteres, incluindo a marca BOM. Carregue o seu ficheiro, desligue o marcador de ordem de bytes se estiver seleccionado, revave e deverá ser feito.

Texto Em Alt http://oth4.com/encoding.png

E não é livre, mas há um julgamento livre, e é um excelente editor (compatibilidade limitada com TextMate).

 1
Author: dmp, 2015-05-09 16:52:55
Aqui está outra boa solução para o problema com o BOM. Estes são dois VBScript (.VBS) scripts. Um por encontrar o BOM num ficheiro e outro por matar o maldito BOM no ficheiro. Funciona muito bem e é fácil de usar. Basta criar um .arquivo vbs, e colar o seguinte código nele.

Você pode usar o script VBScript simplesmente arrastando e largando o arquivo suspeito para o .ficheiro vbs. Ele dir-lhe-á se há um BOM ou nao.

' 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 ele diz que há BOM, vá e crie o segundo .ficheiro vbs com o seguinte código e arraste o ficheiro suspicios para o .ficheiro 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
Author: NoEs, 2015-05-09 17:06:20

O mesmo problema, mas só afectou um ficheiro, por isso acabei de criar um ficheiro em branco, copiar/colar o código do ficheiro original para o novo ficheiro, e depois substituí o ficheiro original. Não é chique, mas funcionou.

 0
Author: jiminy, 2014-04-30 20:39:43

Usar O comandante total {[3] } para procurar por todos os ficheiros com bombas:

uma forma elegante de procurar por ficheiros UTF-8 com o BOM?

  • Abra esses arquivos em algum editor apropriado (que reconhece BOM) como Eclipse.

  • Muda a codificação do ficheiro para ISO (carregue com o botão direito, propriedades).

  • Cortar do início do Arquivo, Salvar

  • Mudar a codificação do ficheiro para UTF-8

...e nem pense em usar n...d outra vez!

 0
Author: Jan Przybylo, 2017-05-23 12:18:20

Pode abri-lo por PhpStorm e carregar com o botão direito no seu ficheiro e carregar em Remover BOM ...

 0
Author: behtateam, 2015-05-09 16:59:44
Tive o mesmo problema. O problema foi porque um dos meus arquivos php estava em utf-8 (o mais importante, o arquivo de configuração que está incluído em todos os arquivos php). No meu caso, tinha duas soluções diferentes que funcionavam para mim:

Primeiro, mudei a configuração do Apache usando o AddDefaultCharsetDirective em ficheiros de configuração (ou em .htaccess). Esta solução força o Apache a usar a encodagem correta.

AddDefaultCharset ISO-8859-1
A segunda solução era mudar o mal. codificação do ficheiro php.
 0
Author: SkaJess, 2016-02-11 07:59:47
  1. Copie o texto do seu nome de ficheiro.ficheiro css.
  2. Feche o seu ficheiro css.
  3. mudar o nome do ficheiro 2.css para evitar um conflito de nomes de ficheiros.
  4. no MS Notepad ou Wordpad, criar um novo ficheiro.
  5. cola o texto nele.
  6. Guarda - o como nome de ficheiro.css, seleccionando UTF-8 das opções de codificação.
  7. Enviar o nome do ficheiro.Forum.
 0
Author: Benjamin, 2017-12-12 18:42:48

No PHPStorm, para vários ficheiros e BOM não necessariamente no início do ficheiro, poderá procurar {[[0]} (expressão Regular) e substituir por nada.

 0
Author: Guillaume Renoult, 2018-02-22 03:43:12

Verifique o seu {[[0]}, encontre"... charset=iso-8859-1 "e substitui - o por"... charset=utf-8".

Talvez funcione.
 -3
Author: John Great, 2015-05-09 16:58:02