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