我有一个CSS文件,当我使用gedit打开它时看起来很好,但是当它被PHP读取(将所有CSS文件合并为一个)时,这个CSS前面加上了以下字符:ï »¿
PHP删除所有空格,因此在代码中间随机会弄乱整个事物。正如我所提到的,当我在gedit中打开文件时,我实际上看不到这些字符,因此我无法轻易删除它们。
我搜索了问题,文件编码显然有问题,这是有意义的,因为我一直在通过ftp和rsync将文件转移到不同的Linux / Windows服务器,范围文本编辑。我对字符编码并不是很了解,所以请帮助。
如果有帮助,文件将以UTF-8格式保存,gedit将不允许我以ISO-8859-15格式保存(该文档包含一个或多个无法使用指定字符编码的字符)编码)。我尝试用Windows和Linux行结尾保存它,但都没有帮助。
答案 0 :(得分:138)
三个字给你:
这是ISO-8859-1中UTF-8 BOM的表示。您必须告诉编辑不要使用BOM或使用其他编辑器去除它们。
要自动移除BOM,您可以awk
使用 <?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...
?>
。
作为this question,最好是让PHP真正正确地解释BOM,因为你可以使用another answer says,如下所示:
{{1}}
答案 1 :(得分:21)
在Notepad++中打开您的文件。在编码菜单中,选择转换为无BOM的UTF-8 ,保存文件,将旧文件替换为此新文件。该死的确有效。
答案 2 :(得分:21)
在PHP中,您可以执行以下操作以删除所有非字符,包括相关字符。
$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
答案 3 :(得分:19)
对于那些有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
答案 4 :(得分:11)
BOM只是一个字符序列(UTF-8的$ EF $ BB $ BF),所以只需使用脚本删除它们或配置编辑器就不会添加它。
#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);
我确信它很容易转换为PHP。
答案 5 :(得分:6)
对我来说,这很有效:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
如果我删除此元,则再次出现希望这有助于某人...
答案 6 :(得分:5)
我不知道PHP,所以我不知道这是否可行,但最好的解决方案是将文件读取为UTF-8而不是其他编码。 BOM实际上是一个零宽度无空间。这是空格,因此如果以正确的编码(UTF-8)读取文件,则BOM将被解释为空格,并且在生成的CSS文件中将被忽略。
此外,以正确的编码方式读取文件的另一个好处是,您不必担心字符被误解。您的编辑告诉您,要保存的代码页将不会执行您需要的所有字符。如果PHP然后以不正确的编码读取文件,那么除了BOM之外的其他字符很可能被默默地误解。到处使用UTF-8,这些问题就消失了。
答案 7 :(得分:3)
您可以使用
vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'
用awk替换似乎有效,但它没有到位。
答案 8 :(得分:2)
在Notepad ++中打开所讨论的PHP文件。
单击顶部的编码并更改为&#34;编码为UTF-8而不使用BOM&#34;只是&#34;编码为UTF-8&#34;。保存并覆盖服务器上的文件。
答案 9 :(得分:2)
我的一些PHP文件中出现了相同的问题()。
如果您使用PhpStorm,则可以设置热键将其删除至设置 - &gt; IDE设置 - &gt;键盘图 - &gt;主菜单 - &gt;档案 - &gt;删除BOM。
答案 10 :(得分:2)
grep -rl $'\ xEF \ xBB \ xBF'* | xargs vim -e -c'argdo set fileencoding = utf-8 | set encoding = utf-8 |设置nobomb | WQ'
答案 11 :(得分:2)
在Notepad ++中,选择&#34;编码&#34;菜单,然后&#34;在没有BOM&#34;的UTF-8中编码。然后保存。
请参阅Stack Overflow问题 How to make Notepad to save text in UTF-8 without BOM? 。
答案 12 :(得分:1)
如果您需要能够从UTF-8编码文件中删除BOM,首先需要掌握能够识别它们的编辑器。
我个人使用E Text Editor。
在右下角,有字符编码选项,包括BOM标记。加载文件,取消选择字节顺序标记(如果已选中),重新保存,应该完成。
Alt text http://oth4.com/encoding.png
E不是免费的,但有一个免费试用版,它是一个出色的编辑器(有限TextMate兼容性)。
答案 13 :(得分:1)
在PHPStorm中,对于多个文件和BOM不一定在文件的开头,您可以搜索\x{FEFF}
(正则表达式)并替换为空。
答案 14 :(得分:1)
这是BOM问题的另一个好方法。这是两个VBScript(。vbs)脚本。
一个用于在文件中查找BOM,另一个用于在文件中杀死该死的BOM。它工作得非常好,易于使用。
只需创建.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。
答案 15 :(得分:1)
您可以PhpStorm打开它并右键单击您的文件,然后点击删除BOM ...
答案 16 :(得分:1)
同样的问题,不同的解决方案。
PHP文件中的一行是打印出XML标题(使用与PHP相同的开始/结束标记)。看起来这些标签中的代码设置了编码,并在PHP中执行,导致了奇怪的字符。无论哪种方式都是解决方案:
# Original
$xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";
答案 17 :(得分:0)
同样的问题,但它只影响了一个文件,所以我只创建了一个空白文件,将原始文件中的代码复制/粘贴到新文件中,然后替换原始文件。不花哨但有效。
答案 18 :(得分:0)
使用Total Commander搜索所有BOMed文件:
Elegant way to search for UTF-8 files with BOM?
在Eclipse之类的适当编辑器(识别BOM)中打开这些文件。
将文件的编码更改为ISO(右键单击,属性)。
从文件开头剪切,保存
将文件的编码更改回UTF-8
...甚至不考虑再次使用n ... d!
答案 19 :(得分:0)
我遇到了同样的问题。问题是因为我的一个php文件是在utf-8中(最重要的是,配置文件包含在所有php文件中)。
就我而言,我有两种不同的解决方案对我有用:
首先,我在配置文件(或.htaccess)中使用AddDefaultCharsetDirective更改了Apache配置。此解决方案迫使Apache使用正确的编码。
AddDefaultCharset ISO-8859-1
第二个解决方案是更改php文件的错误编码。
答案 20 :(得分:0)
答案 21 :(得分:0)
这对我有用!
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
答案 22 :(得分:-3)
检查index.php
,找到“... charset=iso-8859-1
”并将其替换为“... charset=utf-8
”。
也许它会起作用。