Как удалить ï »¿из начала файла? - PullRequest
135 голосов
/ 15 июля 2010

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

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

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

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

Ответы [ 22 ]

141 голосов
/ 15 июля 2010

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

Метка порядка байтов (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...
  ?>
21 голосов
/ 20 декабря 2013

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

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
21 голосов
/ 18 декабря 2014

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

19 голосов
/ 15 июля 2013

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

Код:

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

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

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

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

set nobomb

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

wq
11 голосов
/ 15 июля 2010

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

С Извлечение спецификации из UTF-8 :

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

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

6 голосов
/ 12 ноября 2014

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

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

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

5 голосов
/ 15 июля 2010

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

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

3 голосов
/ 12 апреля 2012

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

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

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

2 голосов
/ 08 марта 2013

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

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

2 голосов
/ 29 ноября 2013

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

...