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

时间:2010-07-15 13:35:37

标签: php utf-8 character-encoding byte-order-mark mojibake

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

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

我搜索了问题,文件编码显然有问题,这是有意义的,因为我一直在通过ftp和rsync将文件转移到不同的Linux / Windows服务器,范围文本编辑。我对字符编码并不是很了解,所以请帮助。

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

23 个答案:

答案 0 :(得分:138)

三个字给你:

Byte Order Mark (BOM)

这是ISO-8859-1中UTF-8 BOM的表示。您必须告诉编辑不要使用BOM或使用其他编辑器去除它们。

要自动移除BOM,您可以awk使用 <?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... ?>

作为this question,最好是让PHP真正正确地解释BOM,因为你可以使用another answer says,如下所示:

{{1}}

答案 1 :(得分:21)

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

答案 2 :(得分:21)

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

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

答案 3 :(得分:19)

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

答案 4 :(得分:11)

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

来自Removing BOM from UTF-8

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

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

答案 5 :(得分:6)

对我来说,这很有效:

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

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

答案 6 :(得分:5)

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

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

答案 7 :(得分:3)

您可以使用

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

用awk替换似乎有效,但它没有到位。

答案 8 :(得分:2)

在Notepad ++中打开所讨论的PHP文件。

单击顶部的编码并更改为&#34;编码为UTF-8而不使用BOM&#34;只是&#34;编码为UTF-8&#34;。保存并覆盖服务器上的文件。

答案 9 :(得分:2)

我的一些PHP文件中出现了相同的问题()。

如果您使用PhpStorm,则可以设置热键将其删除至设置 - &gt; IDE设置 - &gt;键盘图 - &gt;主菜单 - &gt;档案 - &gt;删除BOM。

答案 10 :(得分:2)

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

答案 11 :(得分:2)

在Notepad ++中,选择&#34;编码&#34;菜单,然后&#34;在没有BOM&#34;的UTF-8中编码。然后保存。

请参阅Stack Overflow问题 How to make Notepad to save text in UTF-8 without BOM?

答案 12 :(得分:1)

如果您需要能够从UTF-8编码文件中删除BOM,首先需要掌握能够识别它们的编辑器。

我个人使用E Text Editor

在右下角,有字符编码选项,包括BOM标记。加载文件,取消选择字节顺序标记(如果已选中),重新保存,应该完成。

Alt text http://oth4.com/encoding.png

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

答案 13 :(得分:1)

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

答案 14 :(得分: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

答案 15 :(得分:1)

您可以PhpStorm打开它并右键单击您的文件,然后点击删除BOM ...

答案 16 :(得分:1)

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

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\"?" . ">";

答案 17 :(得分:0)

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

答案 18 :(得分:0)

使用Total Commander搜索所有BOMed文件:

Elegant way to search for UTF-8 files with BOM?

  • Eclipse之类的适当编辑器(识别BOM)中打开这些文件。

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

  • 从文件开头剪切,保存

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

...甚至不考虑再次使用n ... d!

答案 19 :(得分:0)

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

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

首先,我在配置文件(或.htaccess)中使用AddDefaultCharsetDirective更改了Apache配置。此解决方案迫使Apache使用正确的编码。

AddDefaultCharset ISO-8859-1

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

答案 20 :(得分:0)

  1. 复制filename.css文件的文本。
  2. 关闭您的css文件。
  3. 将其重命名为filename2.css以避免文件名冲突。
  4. 在MS记事本或写字板中,创建一个新文件。
  5. 将文字粘贴到其中。
  6. 将其另存为filename.css,从编码选项中选择UTF-8。
  7. 上传filename.css。

答案 21 :(得分:0)

这对我有用!

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

答案 22 :(得分:-3)

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

也许它会起作用。