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


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.