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


145

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

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

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

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


Это кажется, чтобы решить проблему. 95isalive.com/expression/index.html

30
Кто-то снимает нас с спецификации
— Дэвид Хеффернан,

Ответы:


151

Три слова для тебя:

Порядок следования байтов (BOM)

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

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

Как говорит другой ответ , лучше всего было бы для PHP на самом деле правильно интерпретировать BOM, для этого вы можете использовать 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...
  ?>

Да, я обнаружил это, когда гуглил, но как мне их убрать?
— Мэтт

10
Он не удаляет спецификацию, он игнорирует ее.
— Коул Джонсон

Или другой способ (игнорировать) может быть изменение кодировки.
— mr5

Блокнот Windows (тьфу) добавляет их; предложение от дублирования этого вопроса состоит в том, чтобы использовать Notepad ++, который позволяет установить «UTF-8 без BOM» в качестве кодировки. Или используйте настоящий редактор ... (emacs!) :-)
— jesup

2
В этом и заключается проблема: разные кодировки используют разные байты для одних и тех же символов. Прочитайте еще раз третий абзац ответа.
— Винко Врсалович

24

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


1
В Notepad ++ v7.6.6 (64-разрядная версия) вам нужно нажать кнопку « Преобразовать в UTF-8» .
— Stomy

23

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

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

1
в случае, если вы просто хотите убить «ï», используйте это $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
— guido _nhcol.com.br_

@ guido_nhcol.com.br_ Вы добавляете дополнительное /, оно должно быть:$response = preg_replace('/[\x80-\xFF]/', '', $response);
— H Aßdøµ

20

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

Код:

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

и если вы не против редактора vi , откройте файл в vi:

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

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

set nobomb

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

wq

1
Используйте grep -rlI $'\xEF\xBB\xBF' .для игнорирования двоичных файлов.
— Наби КАЗ

11

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

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

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

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


6
Обратите внимание, что спецификация - это не последовательность символов, это отдельный символ. Если файл находится в формате UTF-8, то символ представлен тремя байтами . Если файл находится в формате UTF-8, то просмотр его в другой кодировке (т. Е. В которой EF BB BF появляется там, где должна быть спецификация) является ошибкой. Чтобы удалить спецификацию из файла UTF-8, необходимо удалить (одиночный) символ U + FEFF. Да, педантизм!
— Джеффри Л Уитледж

1
Я не мог заставить это работать в PHP (это только моя некомпетентность, а не ваша: P), поэтому я проверил, есть ли спецификация, и удалил первые 3 символа. Вот код, если кому-то это нужно: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
— Мэтт

7
это переводится как php $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. прежде чем использовать это, пересмотрите, если вы не можете решить проблему в источнике вместо этого.
— commonpike

6

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

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

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


5

Я не знаю PHP, поэтому я не знаю, возможно ли это, но лучшим решением было бы прочитать файл как UTF-8, а не какую-то другую кодировку. Спецификация на самом деле нулевая ширина без перерывов. Это пробел, поэтому, если файл читается в правильной кодировке (UTF-8), то спецификация будет интерпретироваться как пробел и будет игнорироваться в полученном файле CSS.

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


3

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

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

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


2

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


Используйте grep -rlI $'\xEF\xBB\xBF' .для игнорирования двоичных файлов. А также .лучше, чем *здесь.
— Наби КАЗ

2

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

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



2

Откройте файл PHP под вопросом в Notepad ++.

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


1

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

Одна строка в файле 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\"?" . ">";

1

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

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

В правом нижнем углу находятся параметры кодировки символов, включая тег BOM. Загрузите ваш файл, снимите флажок Byte Order Marker, если он выбран, восстановите его, и это должно быть сделано.

Альтернативный текст http://oth4.com/encoding.png

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


1
Ссылка на изображение не работает.
— Питер Мортенсен

1

Вы можете открыть его PhpStorm и щелкните правой кнопкой мыши на файл и нажмите на кнопку Remove BOM ...


1

Вот еще одно хорошее решение проблемы с спецификацией. Это два 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 со следующим кодом и перетащите файл suspicios в файл .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

Код от Хейко Джендрек .


1

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


0

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


0

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

Элегантный способ поиска файлов UTF-8 с помощью спецификации?

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

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

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

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

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


0

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

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

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

AddDefaultCharset ISO-8859-1

Второе решение состояло в том, чтобы изменить неправильную кодировку файла php.


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

-3

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

Может быть, это сработает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.