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


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

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

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

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

22 119

22 ответа:

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

метка порядка байтов (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...
  ?>

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

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

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

код:

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

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

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

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

set nobomb

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

wq

откройте файл в Блокнот++. Из кодирование выберите конвертировать в UTF-8 без BOM, сохраните файл, замените старый файл на этот новый файл. И это сработает, черт возьми.

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

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

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

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

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

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

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

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

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

можно использовать

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

замена с awk, кажется, работает, но не на месте.

греп -РЛ $'\также xef\xBB по\ИЦ' * | команды xargs ВИМ -е-с 'argdo установить атрибуты fileencoding=UTF-8 не|установить кодировка=кодировка UTF-8| комплект nobomb| ВК'

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

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

в Notepad++ выберите меню "кодировка", затем"кодировать в UTF-8 без спецификации". После этого сохранить.

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

откройте PHP-файл, о котором идет речь, в Notepad++.

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

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

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

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

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

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

Я лично использую E Текстовый Редактор.

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

Alt текст http://oth4.com/encoding.png

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

вот еще одно хорошее решение проблемы с BOM. Это два VBScript (.ВБС) скрипты.

один для поиска спецификации в файле и один для убийства проклятой спецификации в файле. Он работает довольно хорошо и прост в использовании.

просто создать .файл 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

если он говорит вам, что есть BOM, идите и создайте второй .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

код из Хайко Jendreck.

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

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

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

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

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

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

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

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

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

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

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

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

AddDefaultCharset ISO-8859-1

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

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

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

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

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