如何从文件的开头删除?

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

PHP 删除了所有的空格,所以代码中间的一个随机元素会把整个事情搞得一团糟。正如我提到的,当我在 gedit 中打开文件时,我实际上看不到这些字符,所以我不能很容易地删除它们。

我在谷歌上搜索了这个问题,发现文件编码明显有问题,这是有道理的,因为我一直在通过 ftp 和 Rsync将文件转移到不同的 Linux/Windows 服务器,并使用了一系列文本编辑器。不过我对字符编码并不是很了解,所以希望你能帮帮我。

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

233058 次浏览

送你三个字:

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

如果您需要能够从 UTF-8编码的文件中删除 BOM,那么您首先需要获得一个能够识别它们的编辑器。

我个人使用 电子文本编辑器

在右下角,有一些字符编码选项,包括 BOM 标签。加载您的文件,取消选择字节顺序标记,如果它被选中,重新保存,并应该这样做。

备用 http://oth4.com/encoding.png

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

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

另外,以正确的编码读取文件的另一个好处是,您不必担心字符被误解。您的编辑器告诉您,要保存它的代码页不会完成所需的所有字符。如果 PHP 以不正确的编码读取文件,那么除 BOM 之外的其他字符很可能被无声地误解。在任何地方使用 UTF-8,这些问题就会消失。

BOM 只是一个字符序列($EF $BB $BF for UTF-8) ,所以只需要使用脚本删除它们或配置编辑器,这样就不会添加它们。

来自 从 UTF-8删除 BOM:

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

我相信它很容易翻译成 PHP。

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

PHP 文件中的一行是打印 XML 头(它使用与 PHP 相同的开始/结束标记)。这些标记中的代码似乎设置了编码,并在 PHP 中执行,这导致了奇怪的字符。不管怎样,解决办法是:

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


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

使用 绝对的指挥官搜索所有 BOMed 文件:

优雅的方式搜索 UTF-8文件与 BOM?

  • 在一些适当的编辑器(识别 BOM)(如 日食)中打开这些文件。

  • 将文件的编码更改为 ISO (右键单击,属性)。

  • 从文件的开头剪切,保存

  • 将文件的编码改回 UTF-8

别想再用 n... d!

你可以用

vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'

用 awk 替换似乎有效,但它不在适当的位置。

我的一些 PHP 文件中出现的 BOM 也有同样的问题(ï“ ï”)。

如果你使用 PhpStorm,你可以在设置-> IDE 设置-> 键盘图-> 主菜单-> 文件-> 删除 BOM。

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

也许会有用。

对于那些有 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

您可以打开它的 PhpStorm和右键单击您的文件,并点击 移除 BOM..。

Grep-rl $’xEF xBB xBF’* | xargs vim-e-c‘ argdo set filecoding = utf-8 | set coding = utf-8 | set noBomb | wq’

PHP中,可以执行以下操作来删除所有非字符,包括有问题的字符。

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

同样的问题,但它只影响一个文件,所以我只创建了一个空白文件,将代码从原始文件复制/粘贴到新文件,然后替换原始文件。虽然不怎么样,但还是奏效了。

在记事本 + + ,选择“编码”菜单,然后“编码在 UTF-8没有 BOM”。然后保存。

参见堆栈溢出问题 如何在没有 BOM 的情况下制作记事本来保存 UTF-8格式的文本

下面是另一个解决 BOM 问题的好办法。

一个是在文件中找到 BOM,一个是在文件中杀死该死的 BOM。它的工作原理很好,使用方便。

只需创建一个.vbs 文件,并在其中粘贴以下代码。

可以通过将可疑文件拖放到。Vbs 文件。它会告诉你是否有 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 文件,并将怀疑文件拖到。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

对我来说,这个方法奏效了:

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

如果我删除这个元数据,“ ï”将再次出现。希望这能帮到某人..。

记事本 + + 打开文件。从 编码中菜单中,选择 转换为无 BOM 的 UTF-8,保存文件,用这个新文件替换旧文件。一定会成功的。

在记事本 + + 中打开问题下的 PHP 文件。

点击顶部的 Encoding,将“ Encoding in UTF-8 without BOM”改为“ Encoding in UTF-8”。在服务器上保存并覆盖该文件。

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

就我而言,我有两种不同的解决方案,对我很有效:

首先,我在配置文件中使用 AddDefaultCharsetDirective (或在。Htaccess).这个解决方案强制 Apache 使用正确的编码。

AddDefaultCharset ISO-8859-1

第二个解决方案是更改 php 文件的错误编码。

  1. 复制 filename.css 文件的文本。
  2. 关闭你的 CSS 文件。
  3. 将其重命名为 filename2.css,以避免文件名冲突。
  4. 在 MSNotepad 或 Wordpad 中,创建一个新文件。
  5. 把文本粘贴进去。
  6. 保存为 filename.css,从编码选项中选择 UTF-8。
  7. 上传 filename.css。

在 PHPStorm 中,对于多个文件和不一定在文件开头的 BOM,您可以搜索 \x{FEFF}(正则表达式)并使用空替换。

这对我有用!

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