如何从文件开头删除?

169

我有一个CSS文件,使用gedit打开时看起来很好,但当PHP读取它(用于合并所有CSS文件),此CSS文件前面会添加以下字符:。

由于PHP会删除所有空格,所以代码中间的随机会破坏整个代码。正如我所提到的,当我在gedit中打开文件时,实际上看不到这些字符,因此无法轻松删除它们。

我在Google上搜索了这个问题,显然文件编码出了问题,可能是因为我通过ftp和rsync将文件移到不同的Linux / Windows服务器,并使用了各种文本编辑器。但我对字符编码不太了解,所以希望得到帮助。

如果有帮助的话,该文件以UTF-8格式保存,并且gedit不允许我将其保存为ISO-8859-15格式(该文档包含一个或多个字符,无法使用指定的字符编码进行编码)。我尝试过使用Windows和Linux换行符保存它,但都没有帮助。


这似乎解决了问题。 http://www.95isalive.com/expression/index.html - user928609
31
有人剥夺了我们的BOM。 - David Heffernan
1
https://dev59.com/J3rZa4cB1Zd3GeqP46OU - phuclv
23个回答

168

有三个词需要注意:

字节顺序标记(BOM)

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...
  ?>

12
它不会移除BOM,而是忽略它。 - Cole Tobin
或者另一种方法是更改编码方式。 - mr5
Windows Notepad(呃)会添加它们;建议使用Notepad++,它允许设置“UTF-8无BOM”作为编码。或者使用一个真正的编辑器...(emacs!) :-) - jesup
3
确实,这正是问题所在,不同的字符编码会对同一字符使用不同的字节。请再次阅读答案的第三段。 - Vinko Vrsalovic
感谢您的回复。这是因为我的文本编辑器处于UTF-8模式,当我将它们粘贴到其中时,必须更改这些字符的编码方式。如果我首先将编辑器设置为IS0 8859-1 Latin 1编码模式,则不会发生这种情况。 - martineau
显示剩余3条评论

32

Notepad++中打开您的文件。从编码菜单中选择不带BOM的UTF-8转换,保存文件,并用此新文件替换旧文件。它一定会起作用。


2
在Notepad++ v7.6.6 (64位)中,您需要点击转换为UTF-8 - stomy

27
PHP 中,您可以执行以下操作来删除所有非字符,包括所讨论的字符。
$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);

1
如果您只想去掉“ï”,请使用以下代码: $response = preg_replace('/[\x80-\xFF]//', '', $response); - nh-labs
@guido_nhcol.com.br_ 您多加了一个斜杠,应该是:$response = preg_replace('/[\x80-\xFF]/', '', $response); - H Aßdøµ

20

对于那些具有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' . 命令来忽略二进制文件。 - Nabi K.A.Z.

11

BOM只是一个字符序列($EF $BB $BF用于UTF-8),所以可以通过脚本或者配置编辑器来移除它们。

引自“从UTF-8中删除BOM”:

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

我相信它很容易转换成PHP。


6
请注意,BOM不是字符序列,而是单个字符。如果文件使用UTF-8编码,则该字符由三个字节表示。 如果以另一种编码(即EF BB BF出现在BOM应该在的位置上的编码)查看UTF-8文件,则会出现错误。要从UTF-8文件中删除BOM,只需删除U+FEFF(单个)字符即可。是的,这很苛刻! - Jeffrey L Whitledge
1
我在PHP中无法使其工作(那只是我的无能,不是你的:P),所以我进行了一次检查,看看BOM是否存在,并删除前三个字符。如果有人需要代码,请看这里: if( substr($css, 0,3) == pack("CCC",0xef,0xbb,0xbf) ) { $css = substr($css, 3); } - Matt
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" />

如果我删除这个元标记,那么将再次出现。希望这能帮助到某些人...

6
我不知道 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

打开Notepad++中的PHP文件。

点击顶部的编码(Encoding),从“UTF-8无BOM编码”更改为“UTF-8编码”。保存并覆盖服务器上的文件。


2

使用grep命令查找所有含有BOM头的文件,并将结果传递给xargs命令,再通过vim命令打开这些文件,并设置编码为utf-8格式,同时去除BOM头后保存并退出。


使用 grep -rlI $'\xEF\xBB\xBF' . 忽略二进制文件。此处使用 .* 更好。 - Nabi K.A.Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接