Как да премахна  от началото на файл?

Имам CSS файл, който изглежда добре, когато го отворя с gedit, но когато се чете от PHP (за да обедините всички CSS файлове в един), този CSS има следните знаци, добавени към него: 

PHP премахва всички бели интервали, така че случаен  в средата на кода обърква всичко. Както споменах, всъщност не мога да видя тези знаци, когато отворя файла в gedit, така че не мога да ги премахна много лесно.

Потърсих в Google проблема и явно нещо не е наред с кодирането на файла, което има смисъл, тъй като прехвърлях файловете на различни Linux/Windows сървъри чрез ftp и rsync, с набор от текстови редактори. Всъщност не знам много за кодирането на символи, така че помощта ще бъде оценена.

Ако помага, файлът се записва във формат UTF-8 и gedit не ми позволява да го запиша във формат ISO-8859-15 (документът съдържа един или повече знаци, които не могат да бъдат кодирани с помощта на указаното кодиране на знаци). Опитах се да го запазя с Windows и Linux окончания на редове, но нито едното не помогна.


person Matt    schedule 15.07.2010    source източник
comment
Изглежда, че това решава проблема. 95isalive.com/expression/index.html   -  person    schedule 05.09.2011
comment
Някой да ни съблече BOM   -  person David Heffernan    schedule 05.09.2011
comment
stackoverflow.com/q/20778921/995714   -  person phuclv    schedule 30.09.2015


Отговори (23)


Три думи за теб:

Марк за ред на байтовете (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...
  ?>
person Vinko Vrsalovic    schedule 15.07.2010
comment
Да, открих това, когато го потърсих в Google, но как да ги премахна? - person Matt; 15.07.2010
comment
Не премахва BOM, а го игнорира. - person Cole Johnson; 24.06.2013
comment
Или другият начин (игнориране) може да бъде промяна на кодирането. - person mr5; 21.10.2015
comment
Windows Notepad (уф) ги добавя; предложение от копие на този въпрос е да се използва Notepad++, което позволява задаване на UTF-8 без BOM като кодиране. Или използвайте истински редактор... (emacs!) :-) - person jesup; 12.02.2016
comment
Добре, сега имам проблеми при надграждане на шрифта за грешка на php 5.4 до 5.6. Може би BOM може да е проблемите - person Tannetto; 17.01.2017
comment
Разбирам, че UTF-8 BOM са шестнадесетичните байтове EF BB BF, но  е C3 AF C2 BB C2 BF—така че отговорът ви няма смисъл в това отношение. - person martineau; 07.10.2017
comment
Точно това е проблемът, различните кодировки на знаци използват различни байтове за едни и същи знаци. Прочетете отново третия параграф от отговора. - person Vinko Vrsalovic; 07.10.2017
comment
Благодаря за отговора Това беше, защото моят текстов редактор беше в режим UTF-8 и трябва да е променил кодирането на тези знаци, когато ги поставих в него. Не прави това, ако първо поставя редактора в режим на кодиране IS0 8859-1 Latin 1. - person martineau; 07.10.2017

Отворете файла си в Notepad++. От менюто Кодиране изберете Конвертиране в UTF-8 без BOM, запазете файла, заменете стария файл с този нов файл. И ще работи, дяволски сигурен.

person V.Rohan    schedule 18.12.2014
comment
В Notepad++ v7.6.6 (64-bit) трябва да щракнете върху Конвертиране в UTF-8. - person stomy; 15.05.2019

В PHP можете да направите следното, за да премахнете всички знаци, които не са, включително въпросния знак.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
person Michael Schreiber    schedule 19.12.2013
comment
в случай, че просто искате да убиете ï, използвайте този $response = preg_replace('/[\x80-\xFF]//', '', $response); - person nh-labs; 08.06.2017
comment
@guido_nhcol.com.br_ Добавяте допълнително /, трябва да е: $response = preg_replace('/[\x80-\xFF]/', '', $response); - person H Aßdøµ; 16.07.2019

За тези с достъп до обвивката тук има малка команда за намиране на всички файлове с BOM, зададена в директорията public_html - не забравяйте да я промените на това, което е вашият правилен път на вашия сървър

Код:

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

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

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

И въведете командата за премахване на BOM:

set nobomb

Запазете файла:

wq
person Diego Palomar    schedule 15.07.2013
comment
Използвайте grep -rlI $'\xEF\xBB\xBF' ., за да игнорирате двоични файлове. - person Nabi K.A.Z.; 11.03.2015

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

От Премахване на BOM от UTF-8:

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

Сигурен съм, че се превежда на PHP лесно.

person Eugene Yokota    schedule 15.07.2010
comment
Обърнете внимание, че BOM не е поредица от знаци, а единичен знак. Ако файлът е в UTF-8, тогава знакът е представен в три байта. Ако файлът е в UTF-8, тогава преглеждането му в друго кодиране (т.е. такова, в което EF BB BF се появява там, където трябва да бъде BOM) е грешка. За да премахнете BOM от UTF-8 файл, трябва да премахнете (единичния) знак U+FEFF. Да, педантичност! - person Jeffrey L Whitledge; 15.07.2010
comment
Не можах да накарам това да работи в PHP (това е просто моя некомпетентност, не ваша :P), така че направих проверка, за да видя дали BOM е там и премахнах първите 3 знака. Ето кода, ако някой има нужда от него: if( substr($css, 0,3) == pack(CCC,0xef,0xbb,0xbf) ) { $css = substr($css, 3); } - person Matt; 15.07.2010
comment
се превежда на php като $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. преди да използвате това, преразгледайте дали не можете да коригирате проблема при източника вместо това. - person commonpike; 06.10.2011

Не знам PHP, така че не знам дали това е възможно, но най-доброто решение би било да прочета файла като UTF-8, а не като друго кодиране. Спецификацията всъщност е НУЛЕВА ШИРИНА БЕЗ ПРАЗНИК. Това е интервал, така че ако файлът се чете в правилното кодиране (UTF-8), тогава BOM ще се интерпретира като интервал и ще бъде игнориран в получения CSS файл.

Също така, друго предимство на четенето на файла в правилното кодиране е, че не е нужно да се притеснявате за неправилно тълкуване на знаци. Вашият редактор ви казва, че кодовата страница, в която искате да го запишете, няма да изпълнява всички знаци, от които се нуждаете. Ако след това PHP чете файла в неправилно кодиране, тогава е много вероятно други знаци освен BOM да бъдат тихо интерпретирани погрешно. Използвайте UTF-8 навсякъде и тези проблеми изчезват.

person Jeffrey L Whitledge    schedule 15.07.2010

За мен това проработи:

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

Ако премахна този мета,  се появява отново. Надявам се това да помогне на някого...

person NickWebman    schedule 12.11.2014

Можеш да използваш

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

Замяната с awk изглежда работи, но не е на мястото си.

person till    schedule 12.04.2012

grep -rl $'\xEF\xBB\xBF' * | xargs vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| задайте nobomb| wq'

person Simone    schedule 29.11.2013
comment
Използвайте grep -rlI $'\xEF\xBB\xBF' ., за да игнорирате двоични файлове. И също така . по-добре от * тук. - person Nabi K.A.Z.; 11.03.2015

Имах същия проблем с BOM, появяващ се в някои от моите PHP файлове ().

Ако използвате PhpStorm, можете да зададете бърз клавиш, за да го премахнете в Settings -> IDE Settings -> Keymap -> Главно меню -> Файл -> Премахване на BOM.

person Toby    schedule 08.03.2013

В Notepad++ изберете менюто „Кодиране“, след това „Кодиране в UTF-8 без BOM“. След това запазете.

Вижте въпроса за Stack Overflow Как да накарам Notepad да записва текст в UTF-8 без BOM?.

person Curtis Yallop    schedule 14.07.2014

Отворете въпросния PHP файл в Notepad++.

Кликнете върху Кодиране в горната част и променете от „Кодиране в UTF-8 без BOM“ на само „Кодиране в UTF-8“. Запазете и презапишете файла на вашия сървър.

person Problem Solved    schedule 21.10.2015

Същият проблем, различно решение.

Един ред в 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\"?" . ">";
person D G    schedule 08.09.2011

Ако трябва да можете да премахнете BOM от UTF-8 кодирани файлове, първо трябва да се сдобиете с редактор, който ги познава.

Аз лично използвам E Text Editor.

В долния десен ъгъл има опции за кодиране на знаци, включително етикета BOM. Заредете файла си, премахнете отметката от Маркер за ред на байтове, ако е избран, запазете отново и трябва да бъде направено.

http://oth4.com/encoding.png

E не е безплатен, но има безплатна пробна версия и е отличен редактор (ограничен TextMate съвместимост).

person dmp    schedule 15.07.2010
comment
Връзката към изображението е повредена. - person Peter Mortensen; 09.05.2015

Можете да го отворите чрез PhpStorm и щракнете с десния бутон върху вашия файл и щракнете върху Премахване на BOM ...

person behtateam    schedule 18.08.2013

Ето още едно добро решение за проблема с 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 файл със следния код и плъзнете 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

Кодът е от Хайко Джендрек.

person NoEs    schedule 22.08.2014

В PHPStorm, за множество файлове и BOM не непременно в началото на файла, можете да търсите \x{FEFF} (регулярен израз) и да замените с нищо.

person Guillaume Renoult    schedule 22.02.2018

Същият проблем, но засегна само един файл, така че току-що създадох празен файл, копирах/поставих кода от оригиналния файл в новия файл и след това замених оригиналния файл. Не е изискано, но проработи.

person jiminy    schedule 30.04.2014

Използвайте Total Commander, за да търсите всички BOMed файлове:

Елегантен начин за търсене на UTF-8 файлове с BOM?

  • Отворете тези файлове в някакъв подходящ редактор (който разпознава BOM) като Eclipse.

  • Променете кодирането на файла на ISO (щракнете с десния бутон, свойства).

  • Изрежете  от началото на файла, запазете

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

...и дори не си помисляйте да използвате n...d отново!

person Jan Przybylo    schedule 19.09.2011

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

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

Първо, промених конфигурацията на Apache, като използвах AddDefaultCharsetDirective в конфигурационните файлове (или в .htaccess). Това решение принуждава Apache да използва правилното кодиране.

AddDefaultCharset ISO-8859-1

Второто решение беше да се промени лошото кодиране на php файла.

person SkaJess    schedule 11.02.2016

  1. Копирайте текста на вашия filename.css файл.
  2. Затворете вашия css файл.
  3. Преименувайте го filename2.css, за да избегнете сблъсък на имена на файлове.
  4. В MS Notepad или Wordpad създайте нов файл.
  5. Поставете текста в него.
  6. Запазете го като filename.css, като изберете UTF-8 от опциите за кодиране.
  7. Качете filename.css.
person Benjamin    schedule 12.12.2017

Това работи за мен!

def removeBOMs(fileName):
     BOMs = ['',#Bytes as CP1252 characters
    'þÿ',
    'ÿþ',
    '^@^@þÿ',
    'ÿþ^@^@',
    '+/v',
    '÷dL',
    'Ýsfs',
    'Ýsfs',
    '^Nþÿ',
    'ûî(',
    '„1•3']
     inputFile = open(fileName, 'r')
     contents = inputFile.read()
     for BOM in BOMs:
         if not BOM in contents:#no BOM in the file...
             pass
         else:
             newContents = contents.replace(BOM,'', 1)
             newFile = open(fileName, 'w')
             newFile.write(newContents)
             return None
person XisUnknown    schedule 19.10.2020

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

Може би ще проработи.

person John Great    schedule 14.04.2013