如何从文件开头删除


145

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

PHP删除了所有空格,因此代码中间的一个随机“ 正如我提到的,当我在gedit中打开文件时,我实际上看不到这些字符,因此我无法轻松地删除它们。

我用谷歌搜索了这个问题,文件编码显然有问题,这是有道理的,因为我一直在通过ftp和rsync用一系列文本编辑器将文件转移到不同的Linux / Windows服务器上。我对字符编码的了解并不多,所以可以帮助您。

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


这似乎解决了问题。95isalive.com/expression/index.html

30
有人剥夺了我们的物料清单
David Heffernan

Answers:


150

三个字给您:

字节顺序标记(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...
  ?>

是的,我在用Google搜索时发现了,但是如何将其删除?
马特2010年

10
它不会删除BOM,而会忽略它。
科尔·约翰逊

或者另一种方法(忽略)可以更改编码。
mr5

Windows记事本(ugh)添加了它们;这个问题的重复建议使用Notepad ++,它允许将“无BOM的UTF-8”设置为编码。或使用Real Editor ...(emacs!):-)
jesup 2016年

2
这就是问题所在,不同的字符编码对相同的字符使用不同的字节。再次阅读答案的第三段。
Vinko Vrsalovic

24

Notepad ++中打开文件。从“ 编码”菜单中,选择“ 转换为不带BOM的UTF-8”,保存文件,然后用此新文件替换旧文件。该死的,肯定会的。


1
在Notepad ++ v7.6.6(64位)中,您需要单击转换为UTF-8
造口术'19

23

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

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

1
如果您只是想杀死“ï”,请使用此$ response = preg_replace('/ [\ x80- \ xFF] //','',$ response);
guido _nhcol.com.br_

@ 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

并输入命令以删除物料清单:

set nobomb

保存文件:

wq

1
使用grep -rlI $'\xEF\xBB\xBF' .忽略二进制文件。
纳比·卡兹

11

BOM只是一个字符序列(UTF-8为$ EF $ BB $ BF),因此只需使用脚本将其删除或配置编辑器即可,因此不会添加。

UTF-8删除BOM

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

我相信它可以轻松地转换为PHP。


6
请注意,物料清单不是字符序列,而是单个字符。如果文件使用UTF-8,则该字符用三个字节表示。如果文件位于UTF-8中,则以另一种编码(即EF BB BF出现在BOM所在的位置)查看该文件是错误的。要从UTF-8文件中删除BOM表,应删除(单个)字符U + FEFF。是的,修脚!
杰弗里·惠特里奇

1
我无法在PHP中使用它(这只是我的能力,不是您的:P),因此我检查了BOM是否存在并删除了前3个字符。这是代码,如果有人需要的话:if(substr($ css,0,3)== pack(“ CCC”,0xef,0xbb,0xbf)){$ css = substr($ css,3); }
马特2010年

7
它转换为php $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);。在使用此功能之前,请重新考虑是否无法从源头上解决问题。
commonpike 2011年

6

对我来说,这可行:

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

如果删除此meta,将再次显示。希望这可以帮助某人...


5

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

grep -rl $'\ xEF \ xBB \ xBF'* | xargs vim -e -c'argdo set fileencoding = utf-8 | set encoding = utf-8 | 设置炸弹| wq'


使用grep -rlI $'\xEF\xBB\xBF' .忽略二进制文件。而且也.*这里更好。
纳比·卡兹

2

我在某些PHP文件(¿

如果使用PhpStorm,则可以在“设置”->“ IDE设置”->“键盘映射”->“主菜单”->“文件”->“删除材料明细表”中设置热键以将其删除。



2

在记事本中打开有疑问的PHP文件。

单击顶部的编码,然后从“在没有BOM的UTF-8中编码”更改为“在UTF-8中编码”。保存并覆盖服务器上的文件。


1

同样的问题,不同的解决方案。

PHP文件中的一行正在打印出XML标头(使用与PHP相同的begin / end标签)。看起来这些标签中的代码设置了编码,并在PHP中执行,导致了奇怪的字符。无论哪种方式,以下是解决方案:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

如果您需要能够从UTF-8编码的文件中删除BOM,则首先需要拥有一个了解它们的编辑器。

我个人使用E文本编辑器

右下角提供了字符编码选项,包括BOM标签。加载文件,如果选择了字节顺序标记,请取消选择它,然后重新保存,然后完成。

替代文字http://oth4.com/encoding.png

E不是免费的,但是有一个免费试用版,它是一个出色的编辑器(与TextMate兼容的局限性)。


1
图像链接断开。
彼得·莫滕森


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



0

同样的问题,但是它只影响一个文件,因此我只创建了一个空白文件,将代码从原始文件复制/粘贴到新文件,然后替换了原始文件。不花哨,但有效。



0

我有同样的问题。问题是因为我的一个php文件在utf-8中(最重要的是,所有php文件中都包含了配置文件)。

就我而言,我有两种对我有用的解决方案:

首先,我通过在配置文件(或.htaccess)中使用AddDefaultCharsetDirective更改了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。

-3

检查您的index.php,找到“ ... charset=iso-8859-1”并将其替换为“ ... charset=utf-8”。

也许会起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.