如何从文件开头删除ï»?

Mat*_*att 140 php byte-order-mark utf-8 character-encoding mojibake

我有一个CSS文件,当我使用gedit打开它时看起来很好,但是当它被PHP读取(将所有CSS文件合并为一个)时,这个CSS前面有以下字符:

PHP删除所有空格,因此代码中间的随机会弄乱整个事物.正如我所提到的,当我在gedit中打开文件时,我实际上看不到这些字符,因此我无法轻易删除它们.

我搜索了问题,文件编码显然有问题,这是有道理的,因为我已经通过ftp和rsync将文件转移到不同的Linux/Windows服务器,并使用一系列文本编辑器.我不太了解字符编码,所以请帮助.

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

Vin*_*vic 143

三个字给你:

字节订单标记(BOM)

这是ISO-8859-1中UTF-8 BOM的表示.您必须告诉编辑不要使用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...
  ?>
Run Code Online (Sandbox Code Playgroud)

  • 它不会删除BOM,它会忽略它. (10认同)
  • 这正是问题所在,不同的字符编码对相同的字符使用不同的字节。再读一遍答案的第三段。 (2认同)

V.R*_*han 22

Notepad ++中打开您的文件.从" 编码"菜单中,选择" 转换为不带BOM的UTF-8",保存文件,将旧文件替换为此新文件.该死的确有效.

  • 在 Notepad++ v7.6.6(64 位)中,您需要单击“**转换为 UTF-8**”。 (2认同)

小智 21

PHP中,您可以执行以下操作来删除所有非字符,包括相关字符.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
Run Code Online (Sandbox Code Playgroud)


Die*_*mar 20

对于那些有shell访问权限的人来说,这是一个小命令,可以在public_html目录中找到BOM设置的所有文件 - 请务必将其更改为服务器上正确的路径

码:

grep -rl $'\xEF\xBB\xBF' /home/username/public_html
Run Code Online (Sandbox Code Playgroud)

如果您对vi编辑器感到满意,请在vi中打开该文件:

vi /path-to-file-name/file.php
Run Code Online (Sandbox Code Playgroud)

并输入命令以删除BOM:

set nobomb
Run Code Online (Sandbox Code Playgroud)

保存文件:

wq
Run Code Online (Sandbox Code Playgroud)


Eug*_*ota 11

BOM只是一系列字符(UTF-8的$ EF $ BB $ BF),所以只需使用脚本删除它们或配置编辑器就不会添加它们.

UTF-8中删除BOM:

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

我确信它很容易转换为PHP.

  • 它将php转换为`$ string = preg_replace('/\x {EF}\x {BB}\x {BF} /','',$ string);`.在使用此功能之前,请重新考虑是否无法在源头修复问题. (7认同)
  • 请注意,BOM不是字符序列,而是单个字符.如果文件是UTF-8,则该字符用三个*字节*表示.如果文件是UTF-8,那么以另一种编码(即,应该在BOM中出现EF BB BF的那个)查看它是一个错误.要从UTF-8文件中删除BOM,应删除(单个)字符U + FEFF.呀,迂腐! (6认同)

小智 6

对我来说,这工作:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

如果我删除此元,则再次出现 希望这有助于某人......


Jef*_*dge 5

我不知道PHP,所以我不知道这是否可行,但最好的解决方案是将文件读取为UTF-8而不是其他编码.BOM实际上是一个零宽度无空间.这是空格,因此如果以正确的编码(UTF-8)读取文件,则BOM将被解释为空格,并且在生成的CSS文件中将被忽略.

此外,以正确的编码方式读取文件的另一个好处是,您不必担心字符被误解.您的编辑告诉您,要保存的代码页将不会执行您需要的所有字符.如果PHP然后以不正确的编码读取文件,那么除了BOM之外的其他字符很可能被默默地误解.到处使用UTF-8,这些问题就消失了.