2010-07-15 88 views
114

我有一個CSS文件,當我用gedit打開它時看起來很好,但是當它被PHP讀取(將所有CSS文件合併成一個文件)時,此CSS具有以下字符:如何從文件的開頭刪除??

PHP刪除所有的空白,所以在代碼中間的隨機篡改整個事情。正如我所提到的,當我在gedit中打開文件時,我實際上看不到這些字符,所以我不能很容易地將它們刪除。

我GOOGLE了這個問題,並有明確有毛病文件的編碼,這是有道理的是,因爲我一直在通過FTP和rsync轉移文件周圍不同的Linux/Windows服務器,與一系列的文本編輯器。雖然我不太瞭解字符編碼,所以請大家幫忙。

如果有幫助,文件將以UTF-8格式保存,並且gedit不會讓我將其保存爲ISO-8859-15格式(文檔包含一個或多個無法使用指定編碼的字符字符編碼)。我試着用Windows和Linux的行結尾來保存它,但都沒有幫助。你

+25

有人把我們從物料清單 – 2011-09-05 09:46:58

+0

這似乎解決了這個問題。 http://www.95isalive.com/expression/index.html – 2011-09-05 09:46:01

+1

http://stackoverflow.com/q/20778921/995714 – 2015-09-30 09:52:16

回答

120

三個字:

Byte Order Mark (BOM)

這是爲UTF-8 BOM在ISO 8859的表現。你必須告訴你的編輯不要使用物料清單或使用不同的編輯器去除它們。

要使BOM清除自動化,您可以使用awk,如this question中所示。

由於another answer says,最好將是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... 
    ?> 
+0

是的,我發現當我GOOGLE了它,但我如何刪除它們? – Matt 2010-07-15 13:38:53

+1

用vim或類似的東西手動刪除它 – Gus 2010-07-15 13:58:45

+9

它不會刪除BOM,它會忽略它。 – 2013-06-23 22:19:35

1

如果您需要能夠從UTF-刪除BOM 8編碼文件,你首先需要掌握一個知道它們的編輯器。我個人使用E Text Editor

在右下角,有用於字符編碼的選項,包括BOM標籤。加載你的文件,取消選擇字節順序標記,如果它被選中,重新保存,它應該完成。

Alt text http://oth4.com/encoding.png

E是不是免費的,但有一個免費試用,並且它是一個極好的編輯器(有限TextMate兼容性)。

+1

圖像鏈接已損壞。 – 2015-05-09 16:53:30

5

我不知道PHP,所以我不知道這是否可能,但最好的解決方案是將文件作爲UTF-8而不是其他編碼讀取。物料清單實際上是一個零寬度無間斷空間。這是空格,所以如果文件以正確的編碼(UTF-8)讀取,則BOM將被解釋爲空格,並且在結果CSS文件中將被忽略。

此外,以正確編碼讀取文件的另一個優點是您不必擔心字符被誤解。你的編輯告訴你,你想要保存的代碼頁不會完成你需要的所有字符。如果PHP正在使用不正確的編碼讀取文件,那麼除了BOM之外的其他字符很可能被誤解。無處不在使用UTF-8,這些問題消失。

11

BOM只是一系列字符(用於UTF-8的$ EF $ BB $ BF),所以只需使用腳本刪除它們或配置編輯器,以免它們被添加。

Removing BOM from 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應該在的編碼中)查看該文件是錯誤的。要從UTF-8文件中刪除BOM,應該刪除(單個)字符U + FEFF。是的,單身! – 2010-07-15 14:05:22

+1

我無法在PHP中工作(這只是我的無能,不是你的:P),所以我做了檢查,看看BOM是否在那裏,並刪除前3個字符。 下面的代碼,如果有人需要它: 如果(SUBSTR($ CSS,0,3)==包( 「CCC」,0xef,爲0xBB,爲0xBF)){$ CSS = SUBSTR($ CSS,3) ; } – Matt 2010-07-15 14:08:06

+7

它將php轉換爲'$ string = preg_replace('/ \ x {EF} \ x {BB} \ x {BF} /','',$ string);'。在使用此之前,請重新考慮是否無法在源代碼處修復問題。 – commonpike 2011-10-06 15:53:12

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\"?" . ">"; 
0

使用Total Commander搜索所有BOMed文件:

Elegant way to search for UTF-8 files with BOM?

  • 打開這些在一些適當的編輯器文件(即識別BOM)像Eclipse

  • 將文件的編碼更改爲ISO(右鍵單擊屬性)。

  • 切割I»¿從文件的開頭,保存

  • 更改文件的編碼回UTF-8

...,甚至不考慮使用n個。再次!

3

您可以使用

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

使用awk更換似乎工作,但它是不到位。

2

我遇到了同樣的問題,出現在我的一些PHP文件中(如圖)。

如果您使用PhpStorm,您可以在設置 - > IDE設置 - >鍵盤映射 - >主菜單 - >文件 - >刪除BOM中將其設置爲熱鍵以將其刪除。

-3

檢查您的index.php,找到「... charset=iso-8859-1」並將其替換爲「... charset=utf-8」。

也許它會工作。

17

對於那些在此shell訪問是一個小命令來查找與public_html目錄設置BOM中的所有文件 - 務必將其更改爲你的正確的路徑在服務器上是

代碼:

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

,如果你是舒適與vi編輯器,打開VI文件:

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

,並輸入命令刪除BOM:

set nobomb 

保存文件:

wq 
+1

使用'grep -rlI $'\ xEF \ xBB \ xBF'.'忽略二進制文件。 – 2015-03-11 16:56:13

0

您可以通過PhpStorm打開它,在你的文件上右鍵單擊,然後單擊刪除BOM ...

2

的grep -rl $」 \ xEF \ xBB \ xBF'* | xargs vim -e -c'argdo set fileencoding = utf-8 | set encoding = utf-8 |設置nobomb | wq'

+0

使用'grep -rlI $'\ xEF \ xBB \ xBF'.'忽略二進制文件。在這裏''''好一點''''''。 – 2015-03-11 16:59:41

19

PHP中,可以執行以下操作來刪除所有非字符,包括有問題的字符。

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

如果你只是想殺死「ï」,用這個 $ response = preg_replace('/ [\ x80- \ xFF] //','',$ response); – 2017-06-08 20:49:01

0

同樣的問題,但它不僅影響一個文件,所以我剛剛創建一個空白文件,複製/粘貼的原始文件的代碼到新的文件,然後替換原來的文件。不花哨,但它的工作。

1

這是另一個解決BOM問題的好方法。這是兩個VBScript(.vbs)腳本。

一個用於在文件中查找物料清單,另一個用於在文件中查找該死的物料清單。它工作得很好,易於使用。

只需創建一個.vbs文件,並在其中粘貼以下代碼。

只需將可疑文件拖放到.vbs文件即可使用VBScript腳本。它會告訴你是否有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 

該代碼是從Heiko Jendreck

5

對於我來說,這個工作:

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

如果我刪除此元的再次出現。希望這可以幫助別人......

13

打開文件Notepad++。從編碼菜單中選擇轉換爲UTF-8不帶BOM,保存文件,用這個新文件替換舊文件。它會工作,該死的肯定。

2

用Notepad ++打開問題中的PHP文件。

單擊頂部的編碼,並從「沒有BOM的UTF-8編碼」更改爲「UTF-8編碼」。保存並覆蓋服務器上的文件。

+0

這些編輯器和編碼非常棘手! – VSB 2016-08-10 15:06:51

0

我有同樣的問題。問題是因爲我的一個php文件在utf-8中(最重要的是,包含在所有php文件中的configuaration文件)。

就我而言,我有2個不同的解決方案,爲我工作:

首先,我在配置文件中使用AddDefaultCharsetDirective(或在.htaccess)改變Apache的配置。這個解決方案迫使Apache使用正確的編碼。

AddDefaultCharset ISO-8859-1 

第二個解決方案是更改php文件的錯誤編碼。

0
  1. 複製filename.css文件的文本。
  2. 關閉你的css文件。
  3. 將其重命名爲filename2.css以避免文件名衝突。
  4. 在MS記事本或寫字板中,創建一個新文件。
  5. 將文本粘貼到其中。
  6. 將其保存爲filename.css,從編碼選項中選擇UTF-8。
  7. 上傳filename.css。
0

在PHPStorm中,對於不一定在文件開頭的多個文件和BOM,您可以搜索\x{FEFF}(正則表達式)並將其替換爲無。