it-swarm.dev

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

Eu tenho um arquivo CSS que parece bem quando eu abri-lo usando gedit =, mas quando é lido por PHP (para mesclar todos os arquivos CSS em um), este CSS tem o seguinte caracteres anteriores a ele: ï "¿

O PHP remove todo o espaço em branco, então um aleatório ï "¿no meio do código estraga tudo. Como mencionei, não consigo ver esses caracteres quando abro o arquivo no gedit, por isso não posso removê-los com muita facilidade.

Eu pesquisei o problema, e há claramente algo errado com a codificação do arquivo, o que faz sentido, já que eu tenho transferido os arquivos para diferentes servidores Linux/Windows via ftp e rsync , com um intervalo de editores de texto. Eu realmente não sei muito sobre codificação de caracteres, então a ajuda seria apreciada.

Se isso ajudar, o arquivo está sendo salvo no formato UTF-8 e o gedit não me permite salvá-lo 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 do Linux, mas nenhum dos dois ajudou.

133
Matt

Três palavras para você:

marca de ordem de byte (BOM)

Essa é a representação para a lista técnica UTF-8 em ISO-8859-1. Você precisa dizer ao seu editor para não usar listas de materiais ou usar um editor diferente para removê-las.

Para automatizar a remoção da BOM, você pode usar awk como mostrado em esta questão .

Como outra resposta diz , o melhor seria para PHP interpretar o BOM corretamente, para isso você pode 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...
  ?>
138
Vinko Vrsalovic

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

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

Abra seu arquivo em 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.

21
V.Rohan

Para aqueles com acesso ao Shell, aqui está um pequeno comando para encontrar todos os arquivos com o BOM definido no diretório public_html - certifique-se de alterá-lo para o caminho correto em seu 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 insira o comando para remover o BOM:

set nobomb

Salve o arquivo:

wq
19
Diego Palomar

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

De Removendo BOM de UTF-8 :

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

Tenho certeza que isso se traduz em PHP facilmente.

11
Eugene Yokota

Para mim, isso funcionou:

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

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

6
NickWebman

Eu não sei PHP, então eu não sei se isso é possível, mas a melhor solução seria ler o arquivo como UTF-8 ao invés de alguma outra codificação. O BOM é na verdade um LARGURA ZERO NO SPACE SPACE. Isso é espaço em branco, portanto, se o arquivo estivesse sendo lido na codificação correta (UTF-8), o BOM seria interpretado como espaço em branco e seria ignorado 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 caracteres sendo interpretados incorretamente. Seu editor está lhe dizendo que a página de código na qual você deseja salvá-lo não fará todos os caracteres necessários. Se PHP estiver lendo o arquivo na codificação incorreta, é muito provável que outros caracteres além da BOM sejam silenciosamente interpretados incorretamente. Use UTF-8 em todos os lugares e esses problemas desaparecem.

5
Jeffrey L Whitledge

Você pode usar

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

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

3
till

Eu tive o mesmo problema com o BOM aparecendo em alguns dos meus arquivos PHP (ï "¿ï" ¿).

Se você usar PhpStorm você pode definir na tecla de atalho para removê-lo em Configurações -> IDE Configurações -> Mapa de Teclas -> Menu Principal -> Arquivo -> Remover BOM.

2
Toby

No Notepad ++, escolha o menu "Codificação", depois "Codificar em UTF-8 sem BOM". Então salve.

Veja a questão do Stack Overflow Como fazer o Bloco de Notas salvar texto em UTF-8 sem BOM?.

2
Curtis Yallop

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

2
Simone

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

Clique em Codificação no topo e mude de "Codificação em UTF-8 sem BOM" para apenas "Codificação em UTF-8". Salve e sobrescreva o arquivo no seu servidor.

2
Problem Solved

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.

1
Guillaume Renoult

Se você precisar remover o BOM dos arquivos codificados em UTF-8, primeiro será necessário conhecer um editor que esteja ciente deles.

Eu pessoalmente uso E Editor de Texto .

No canto inferior direito, há opções para codificação de caracteres, incluindo a tag da lista de materiais. Carregue seu arquivo, desmarque Byte Order Marker se ele estiver selecionado, salve novamente e isso deve ser feito.

Alt text http://oth4.com/encoding.png

E não é gratuito, mas há um teste gratuito, e é um excelente editor (limited TextMate compatibilidade).

1
dmp

O mesmo problema, solução diferente.

Uma linha no arquivo PHP estava imprimindo cabeçalhos XML (que usam as mesmas tags de início/fim do PHP). Parece que o código dentro dessas tags definiu a codificação e foi executado dentro de PHP que resultou nos caracteres estranhos. De qualquer forma 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
D G

Você pode abri-lo por PhpStorm e clique com o botão direito em seu arquivo e clique em Remover BOM ...

1
behtateam

Aqui está outra boa solução para o problema com a BOM. Esses são dois scripts VBScript (.vbs).

Um para encontrar a lista de materiais em um arquivo e um para matar a BOM maldita 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 dirá 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 ele disser que há o BOM, vá e crie o segundo arquivo .vbs com o código a seguir e arraste o arquivo suspicios 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
NoEs

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 duas soluções diferentes que funcionavam para mim:

Primeiro, mudei a configuração do Apache usando AddDefaultCharsetDirective em arquivos de configuração (ou em .htaccess). Essa solução força o Apache a usar o encodeamento correto.

AddDefaultCharset ISO-8859-1

A segunda solução foi mudar a má codificação do arquivo php.

0
SkaJess
  1. Copie o texto do seu arquivo filename.css.
  2. Feche o seu arquivo css.
  3. Renomeie-o como 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. Carregar nome do arquivo.css.
0
Benjamin

Use Total Commander para procurar todos os arquivos BOMED:

Maneira elegante de procurar por arquivos UTF-8 com BOM?

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

  • Altere a codificação do arquivo para ISO (clique direito, propriedades).

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

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

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

0
Jan Przybylo

O mesmo problema, mas afetou apenas um arquivo, por isso acabei de criar um arquivo em branco, copiei/colei o código do arquivo original no novo arquivo e substituí o arquivo original. Não chique, mas funcionou.

0
jiminy