Как удалить символ ï »¿из начала файла?

У меня есть файл CSS, который выглядит нормально, когда я открываю его с помощью gedit, но когда он читается PHP (чтобы объединить все файлы CSS в один), к этому CSS добавлены следующие символы: ï »¿

PHP удаляет все пробелы, поэтому случайный символ «» ¿в середине кода все испортит. Как я уже упоминал, я не вижу этих символов, когда открываю файл в gedit, поэтому я не могу их легко удалить.

Я погуглил проблему, и явно что-то не так с кодировкой файла, что имеет смысл, поскольку я перемещал файлы на разные серверы Linux / Windows через ftp и rsync с рядом текстовых редакторов. Я действительно не очень разбираюсь в кодировке символов, так что помощь будет признательна.

Если это поможет, файл сохраняется в формате UTF-8, и gedit не позволит мне сохранить его в формате ISO-8859-15 (документ содержит один или несколько символов, которые нельзя закодировать с использованием указанной кодировки символов). Я попытался сохранить его с окончанием строк Windows и Linux, но ни один из них не помог.


person Matt    schedule 15.07.2010    source источник
comment
Похоже, это решает проблему. 95isalive.com/expression/index.html   -  person    schedule 05.09.2011
comment
Кто-нибудь снимет нас с спецификации   -  person David Heffernan    schedule 05.09.2011
comment
stackoverflow.com/q/20778921/995714   -  person phuclv    schedule 30.09.2015


Ответы (23)


Три слова для вас:

Метка порядка байтов (BOM)

Это представление спецификации UTF-8 в ISO-8859-1. Вы должны сказать своему редактору, чтобы он не использовал спецификации или не использовал другой редактор, чтобы вырезать их.

Чтобы автоматизировать удаление спецификации, вы можете использовать awk, как показано в этом вопросе .

Как говорится в другом ответе, лучше всего, чтобы PHP действительно правильно интерпретировал спецификацию, для этого вы можете использовать mb_internal_encoding(), нравится:

 <?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...
  ?>
person Vinko Vrsalovic    schedule 15.07.2010
comment
Да, я обнаружил это, когда погуглил, но как мне их удалить? - person Matt; 15.07.2010
comment
Спецификация не удаляется, а игнорируется. - person Cole Johnson; 24.06.2013
comment
Или другой способ (игнорировать) - изменить кодировку. - person mr5; 21.10.2015
comment
Блокнот Windows (тьфу) их добавляет; Предложение от дубликата этого вопроса - использовать Notepad ++, который позволяет установить UTF-8 без спецификации в качестве кодировки. Или используйте настоящий редактор ... (emacs!) :-) - person jesup; 12.02.2016
comment
Хорошо, теперь у меня проблемы при обновлении шрифта ошибки php 5.4 до 5.6. Может быть, спецификация - это проблемы - person Tannetto; 17.01.2017
comment
Насколько я понимаю, спецификация UTF-8 - это шестнадцатеричные байты EF BB BF, однако  равно C3 AF C2 BB C2 BF, поэтому ваш ответ в этом отношении не имеет смысла. - person martineau; 07.10.2017
comment
В этом и заключается проблема, разные кодировки символов используют разные байты для одних и тех же символов. Прочтите еще раз третий абзац ответа. - person Vinko Vrsalovic; 07.10.2017
comment
Спасибо за ответ. Это произошло потому, что мой текстовый редактор был в режиме UTF-8 и, должно быть, изменил кодировку этих символов, когда я их вставлял. Не работает, если я сначала поставлю редактор, это режим кодировки IS0 8859-1 Latin 1. - person martineau; 07.10.2017

Откройте файл в Блокноте ++. В меню Кодировка выберите Преобразовать в UTF-8 без спецификации, сохраните файл, замените старый файл этим новым. И это сработает, черт возьми.

person V.Rohan    schedule 18.12.2014
comment
В Notepad ++ v7.6.6 (64-разрядная версия) вам нужно нажать Преобразовать в UTF-8. - person stomy; 15.05.2019

В PHP вы можете сделать следующее, чтобы удалить все не символы, включая рассматриваемый символ.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
person Michael Schreiber    schedule 19.12.2013
comment
если вы просто хотите убить ï, используйте этот $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response); - person nh-labs; 08.06.2017
comment
@ guido_nhcol.com.br_ Вы добавляете лишний /, он должен быть: $response = preg_replace('/[\x80-\xFF]/', '', $response); - person H Aßdøµ; 16.07.2019

Для тех, у кого есть доступ к оболочке, вот небольшая команда, чтобы найти все файлы с установленной спецификацией в каталоге public_html - обязательно измените ее на правильный путь на вашем сервере.

Код:

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

и если вам удобно пользоваться редактором vi, откройте файл в vi:

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

И введите команду для удаления спецификации:

set nobomb

Сохраните файл:

wq
person Diego Palomar    schedule 15.07.2013
comment
Используйте grep -rlI $'\xEF\xBB\xBF' ., чтобы игнорировать двоичные файлы. - person Nabi K.A.Z.; 11.03.2015

Спецификация - это просто последовательность символов ($ EF $ BB $ BF для UTF-8), поэтому просто удалите их с помощью сценариев или настройте редактор, чтобы он не добавлялся.

Из Удаление спецификации из UTF-8:

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

Я уверен, что это легко переводится на PHP.

person Eugene Yokota    schedule 15.07.2010
comment
Обратите внимание, что спецификация - это не последовательность символов, это один символ. Если файл находится в UTF-8, то символ представлен тремя байтами. Если файл находится в UTF-8, то просмотр его в другой кодировке (то есть такой, в которой EF BB BF отображается там, где должна быть BOM) является ошибкой. Чтобы удалить спецификацию из файла UTF-8, необходимо удалить (одиночный) символ U + FEFF. Ага, педантичность! - person Jeffrey L Whitledge; 15.07.2010
comment
Я не мог заставить это работать в PHP (это просто моя некомпетентность, а не ваша: P), поэтому я проверил, есть ли там спецификация, и удалил первые 3 символа. Вот код, если он кому-то нужен: if (substr ($ css, 0,3) == pack (CCC, 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); } - person Matt; 15.07.2010
comment
он переводится на php как $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. прежде чем использовать это, подумайте, если вместо этого вы не можете решить проблему в источнике. - person commonpike; 06.10.2011

Я не знаю PHP, поэтому не знаю, возможно ли это, но лучшим решением было бы читать файл как UTF-8, а не в какой-либо другой кодировке. Спецификация на самом деле имеет НУЛЕВУЮ ШИРИНУ, БЕЗ РАЗРЫВА. Это пробел, поэтому, если бы файл читался в правильной кодировке (UTF-8), то спецификация интерпретировалась бы как пробел и игнорировалась бы в результирующем файле CSS.

Кроме того, еще одним преимуществом чтения файла в правильной кодировке является то, что вам не нужно беспокоиться о неверной интерпретации символов. Ваш редактор сообщает вам, что кодовая страница, на которой вы хотите ее сохранить, не будет поддерживать все символы, которые вам нужны. Если PHP затем читает файл в неправильной кодировке, то очень вероятно, что другие символы, кроме спецификации, автоматически неверно интерпретируются. Используйте везде UTF-8, и эти проблемы исчезнут.

person Jeffrey L Whitledge    schedule 15.07.2010

Для меня это сработало:

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

Если я удалю эту мету, значок «» снова появится. Надеюсь, это кому-то поможет ...

person NickWebman    schedule 12.11.2014

Вы можете использовать

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

Замена на awk вроде бы сработала, но ее нет.

person till    schedule 12.04.2012

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | установить nobomb | wq '

person Simone    schedule 29.11.2013
comment
Используйте grep -rlI $'\xEF\xBB\xBF' ., чтобы игнорировать двоичные файлы. И также . лучше, чем * здесь. - person Nabi K.A.Z.; 11.03.2015

У меня была такая же проблема с BOM, появляющейся в некоторых моих файлах PHP (ï »¿ï» ¿).

Если вы используете PhpStorm, вы можете установить горячую клавишу, чтобы удалить его в Настройках -> Настройки IDE -> Раскладка клавиатуры. -> Главное меню -> Файл -> Удалить спецификацию.

person Toby    schedule 08.03.2013

В Notepad ++ выберите меню «Кодировка», затем «Кодировать в UTF-8 без спецификации». Тогда сохраните.

См. Вопрос о переполнении стека Как заставить Блокнот сохранять текст в UTF-8 без спецификации?.

person Curtis Yallop    schedule 14.07.2014

Откройте нужный файл PHP в Notepad ++.

Нажмите «Кодировка» вверху и измените «Кодирование в UTF-8 без спецификации» на просто «Кодирование в UTF-8». Сохраните и перезапишите файл на своем сервере.

person Problem Solved    schedule 21.10.2015

Та же проблема, другое решение.

Одна строка в файле PHP распечатывала заголовки XML (которые используют те же теги начала / конца, что и PHP). Похоже, что код в этих тегах установил кодировку и был выполнен в PHP, что привело к появлению странных символов. В любом случае вот решение:

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

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";
person D G    schedule 08.09.2011

Если вам нужно удалить спецификацию из файлов в кодировке UTF-8, вам сначала нужно получить редактор, который знает о них.

Я лично использую E Text Editor.

В правом нижнем углу есть варианты кодировки символов, включая тег спецификации. Загрузите файл, снимите флажок «Маркер порядка байтов», если он выбран, повторно сохраните, и это должно быть сделано.

http://oth4.com/encoding.png

E не является бесплатным, но есть бесплатная пробная версия, и это отличный редактор (ограниченный TextMate совместимость).

person dmp    schedule 15.07.2010
comment
Ссылка на изображение не работает. - person Peter Mortensen; 09.05.2015

Вы можете открыть его с помощью PhpStorm, щелкните файл правой кнопкой мыши и выберите Удалить спецификацию. ...

person behtateam    schedule 18.08.2013

Вот еще одно хорошее решение проблемы со спецификацией. Это два скрипта VBScript (.vbs).

Один для поиска спецификации в файле и один для УБИЙСТВА проклятой спецификации в файле. Он отлично работает и прост в использовании.

Просто создайте файл .vbs и вставьте в него следующий код.

Вы можете использовать сценарий VBScript, просто перетащив подозрительный файл в файл .vbs. Он сообщит вам, есть ли спецификация или нет.

' 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

Если он сообщает вам, что есть спецификация, создайте второй файл .vbs с помощью следующего кода и перетащите файл подозрительного на файл .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

Код взят от Heiko Jendreck.

person NoEs    schedule 22.08.2014

В PHPStorm для нескольких файлов и спецификации не обязательно в начале файла вы можете искать \x{FEFF} (регулярное выражение) и ничего не заменять.

person Guillaume Renoult    schedule 22.02.2018

Та же проблема, но затронула только один файл, поэтому я просто создал пустой файл, скопировал / вставил код из исходного файла в новый файл, а затем заменил исходный файл. Непонятно, но это сработало.

person jiminy    schedule 30.04.2014

Используйте Total Commander для поиска всех файлов BOMed:

Элегантный способ поиска Файлы UTF-8 с спецификацией?

  • Откройте эти файлы в каком-нибудь подходящем редакторе (который распознает спецификации), например Eclipse.

  • Измените кодировку файла на ISO (щелкните правой кнопкой мыши, выберите свойства).

  • Вырезать ï »¿с начала файла, сохранить

  • Измените кодировку файла обратно на UTF-8

... и даже не думай снова использовать n ... d!

person Jan Przybylo    schedule 19.09.2011

У меня такая же проблема. Проблема заключалась в том, что один из моих файлов php был в utf-8 (самый важный, файл конфигурации, который включен во все файлы php).

В моем случае у меня было два разных решения:

Сначала я изменил конфигурацию Apache, используя AddDefaultCharsetDirective в файлах конфигурации (или в .htaccess). Это решение заставляет Apache использовать правильную кодировку.

AddDefaultCharset ISO-8859-1

Второе решение - изменить неправильную кодировку файла php.

person SkaJess    schedule 11.02.2016

  1. Скопируйте текст вашего файла filename.css.
  2. Закройте файл css.
  3. Переименуйте его в filename2.css, чтобы избежать конфликта имен файлов.
  4. В блокноте MS или Wordpad создайте новый файл.
  5. Вставьте в него текст.
  6. Сохраните его как filename.css, выбрав UTF-8 в параметрах кодировки.
  7. Загрузите filename.css.
person Benjamin    schedule 12.12.2017

У меня это работает!

def removeBOMs(fileName):
     BOMs = ['',#Bytes as CP1252 characters
    'þÿ',
    'ÿþ',
    '^@^@þÿ',
    'ÿþ^@^@',
    '+/v',
    '÷dL',
    'Ýsfs',
    'Ýsfs',
    '^Nþÿ',
    'ûî(',
    '„1•3']
     inputFile = open(fileName, 'r')
     contents = inputFile.read()
     for BOM in BOMs:
         if not BOM in contents:#no BOM in the file...
             pass
         else:
             newContents = contents.replace(BOM,'', 1)
             newFile = open(fileName, 'w')
             newFile.write(newContents)
             return None
person XisUnknown    schedule 19.10.2020

Проверьте свой index.php, найдите "... charset=iso-8859-1" и замените его на "... charset=utf-8".

Может сработает.

person John Great    schedule 14.04.2013