Як видалити ï »¿з початку файлу?


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 BOM в ISO-8859-1. Ви повинні сказати своєму редактору не використовувати BOM або використовувати інший редактор, щоб викреслити їх.

Для автоматизації видалення BOM ви можете використовувати, 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...
  ?>

Так, я виявив це, коли переглядав Google, але як їх видалити?
Метт

10
Він не видаляє BOM, він ігнорує.
Коул Джонсон

Або іншим способом (ігнорувати) можна змінити кодування.
mr5

Windows Notepad (ugh) додає їх; Рекомендація від дубліката цього питання полягає у використанні Notepad ++, що дозволяє встановити "UTF-8 без BOM" як кодування. Або скористайтеся справжнім редактором ... (emacs!) :-)
jesup

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

24

Відкрийте свій файл у Блокноті ++ . У меню Кодування виберіть Перетворити в UTF-8 без BOM , збережіть файл, замініть старий на цей новий. І це спрацює, чорт упевнений.


1
У програмі Notepad ++ v7.6.6 (64-розрядна) потрібно натиснути Перетворити в UTF-8 .
стом

23

У PHP ви можете виконати наступне, щоб видалити всі символи, включаючи відповідний символ.

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

1
у випадку, якщо ви просто хочете вбити "ï", використовуйте цей $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guideo _nhcol.com.br_

@ guideo_nhcol.com.br_ Ви додасте додатково /, воно повинно бути:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

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

Код:

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

і якщо вам зручно редактор vi , відкрийте файл in vi:

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

І введіть команду для видалення BOM:

set nobomb

Збережіть файл:

wq

1
Використовуйте grep -rlI $'\xEF\xBB\xBF' .для ігнорування двійкових файлів.
Набі КАЗ

11

BOM - це лише послідовність символів ($ EF $ BB $ BF для UTF-8), тому просто видаліть їх за допомогою скриптів або налаштуйте редактор, щоб він не додався.

З видалення BOM з UTF-8 :

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

Я впевнений, що це легко перекладається на PHP.


6
Зауважте, що BOM - це не послідовність символів, це один символ. Якщо файл знаходиться в UTF-8, то символ представлений у трьох байтах . Якщо файл знаходиться в UTF-8, то перегляд його в іншому кодуванні (тобто такому, в якому EF BB BF з'являється там, де має бути BOM), є помилкою. Щоб видалити BOM з файлу UTF-8, слід видалити (єдиний) char Uter FEFF. Так, педантичність!
Джефрі Л Уітлідж

1
Мені не вдалося це працювати в PHP (це лише моя некомпетентність, а не ваша: P), тому я зробив перевірку, щоб перевірити, чи є BOM там, і видалити перші 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, а не якесь інше кодування. BOM - це насправді ЗЕРО ШИРИНА НЕ РОЗПОДІЛ. Це пробіл, тому якби файл читався у правильному кодуванні (UTF-8), то BOM інтерпретується як пробіл, і він буде ігноруватися в отриманому CSS-файлі.

Крім того, ще однією перевагою читання файлу при правильному кодуванні є те, що вам не доведеться турбуватися про неправильне тлумачення символів. Ваш редактор повідомляє вам, що кодова сторінка, в яку ви хочете зберегти, не виконає всіх потрібних вам символів. Якщо PHP читає файл у неправильному кодуванні, велика ймовірність, що інші символи, окрім BOM, мовчки неправильно трактуються. Використовуйте 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 | встановити nobomb | wq '


Використовуйте grep -rlI $'\xEF\xBB\xBF' .для ігнорування двійкових файлів. А також .краще тоді *тут.
Набі КАЗ

2

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

Якщо ви використовуєте PhpStorm, ви можете встановити за допомогою гарячої клавіші, щоб видалити його в Налаштуваннях -> Налаштування IDE -> Клавіатура -> Головне меню -> Файл -> Видалити BOM.



2

Відкрийте спірний файл PHP у «Блокноті ++».

Клацніть на «Кодування» вгорі та перейдіть від «Кодування в UTF-8 без BOM» на «Кодування в 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

Якщо вам потрібно мати змогу видалити BOM з файлів, кодованих UTF-8, спершу вам потрібно влаштуватись з відомим їм редактором.

Я особисто використовую E Text Editor .

У нижньому правому куті є варіанти кодування символів, включаючи тег BOM. Завантажте свій файл, зніміть позначку маркера замовлення байтів, якщо він вибраний, збережіть його, і це потрібно зробити.

Введіть текст http://oth4.com/encoding.png

E не безкоштовний, але є безкоштовна пробна версія, і це відмінний редактор (обмежена сумісність TextMate ).


1
Посилання на зображення перервано.
Пітер Мортенсен

1

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


1

Ось ще одне вдале рішення проблеми з BOM. Це два VBScript (.vbs).

Один для знаходження BOM у файлі та один для Вбивства проклятого BOM у файлі. Він працює досить добре і простий у використанні.

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

Ви можете використовувати сценарій VBScript, просто перетягуючи підозрілий файл у файл .vbs. Він скаже вам, є BOM чи ні.

' 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-файл із наступним кодом та перетягніть файл sumios на .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, для декількох файлів і BOM, не обов'язково на початку файлу, ви можете шукати \x{FEFF}(Regular Expression) і замінювати нічим.


0

Ця ж проблема, але вона торкнулася лише одного файлу, тому я просто створив порожній файл, скопіював / вставив код з вихідного файлу в новий файл, а потім замінив вихідний файл. Не фантазії, але це спрацювало.


0

Використовуйте Total Commander для пошуку всіх файлів BOMed:

Елегантний спосіб пошуку файлів UTF-8 за допомогою BOM?

  • Відкрийте ці файли в належному редакторі (який розпізнає 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.