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


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.