【问题标题】:How do I remove  from the beginning of a file?如何从文件的开头删除?
【发布时间】:2011-03-16 10:06:12
【问题描述】:

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

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

我用谷歌搜索了这个问题,文件编码显然有问题,这是有道理的,因为我一直在通过 ftp 和 rsync 将文件转移到不同的 Linux/Windows 服务器,并带有一系列文本编辑。不过,我对字符编码知之甚少,因此不胜感激。

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

【问题讨论】:

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


【解决方案1】:

给你三个字:

Byte Order Mark (BOM)

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

要自动删除 BOM,您可以使用 awk,如 this question 所示。

作为another answer says,最好让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...
  ?>

【讨论】:

  • 是的,我在谷歌搜索时发现了它,但是如何删除它们?
  • 它不会删除 BOM,它会忽略它。
  • 或者其他方式(忽略)可以改变编码。
  • Windows 记事本(呃)添加它们;这个问题的一个建议是使用记事本++,它允许将“UTF-8 without BOM”设置为编码。或者使用真正的编辑器...(emacs!):-)
  • 这正是问题所在,不同的字符编码对相同的字符使用不同的字节。再读一遍答案的第三段。
【解决方案2】:

Notepad++ 中打开您的文件。从编码菜单中,选择Convert to UTF-8 without BOM,保存文件,用这个新文件替换旧文件。它会起作用的,该死的。

【讨论】:

  • 在 Notepad++ v7.6.6 (64-bit) 中,您需要点击Convert to UTF-8
【解决方案3】:

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

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

【讨论】:

  • 如果你只想杀死 "ï" 使用这个 $response = preg_replace('/[\x80-\xFF]//', '', $response);
  • @guido_nhcol.com.br_你多加一个/,应该是:$response = preg_replace('/[\x80-\xFF]/', '', $response);
【解决方案4】:

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

【讨论】:

  • 使用grep -rlI $'\xEF\xBB\xBF' . 忽略二进制文件。
【解决方案5】:

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

来自Removing BOM from UTF-8

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

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

【讨论】:

  • 请注意,BOM 不是字符序列,而是单个字符。如果文件是 UTF-8 格式,则字符以三个 字节 表示。如果文件是 UTF-8 格式,那么以另一种编码(即 EF BB BF 出现在 BOM 的位置)查看它是错误的。要从 UTF-8 文件中删除 BOM,应删除(单个)字符 U+FEFF。是的,迂腐!
  • 我无法在 PHP 中使用它(这只是我的无能,不是你的 :P),所以我检查了 BOM 是否存在并删除了前 3 个字符。这是代码,如果有人需要的话: if( substr($css, 0,3) == pack("CCC",0xef,0xbb,0xbf) ) { $css = substr($css, 3); }
  • 它转换为 php 为 $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string); 。在使用它之前,请重新考虑是否无法从源头上解决问题。
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    对我来说,这很有效:

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

    如果我删除此元数据, 会再次出现。希望这对某人有所帮助...

    【讨论】:

      【解决方案8】:

      你可以使用

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

      换成awk好像可以,但是没到位。

      【讨论】:

        【解决方案9】:

        grep -rl $'\xEF\xBB\xBF' * | xargs vim -e -c 'argdo 设置文件编码=utf-8|设置编码=utf-8|集炸弹| wq'

        【讨论】:

        • 使用grep -rlI $'\xEF\xBB\xBF' . 忽略二进制文件。还有.* 更好。
        【解决方案10】:

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

        如果你使用PhpStorm,你可以在设置 -> IDE 设置 -> 键盘映射 -> 主菜单 -> 文件 -> 删除 BOM 中设置热键来删除它。

        【讨论】:

          【解决方案11】:

          在 Notepad++ 中,选择“编码”菜单,然后选择“在没有 BOM 的情况下以 UTF-8 编码”。然后保存。

          查看堆栈溢出问题How to make Notepad to save text in UTF-8 without BOM?

          【讨论】:

            【解决方案12】:

            在 Notepad++ 中打开有问题的 PHP 文件。

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

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

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

                我个人使用E Text Editor

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

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

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

                【讨论】:

                • 图片链接失效。
                【解决方案15】:

                您可以通过PhpStorm 打开它并右键单击您的文件并单击删除 BOM...

                【讨论】:

                  【解决方案16】:

                  这是另一个解决 BOM 问题的好方法。这是两个VBScript (.vbs) 脚本。

                  一个用于在文件中查找 BOM,另一个用于 KILLING 文件中该死的 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

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

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

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

                        • 在适当的编辑器(识别 BOM)中打开这些文件,例如 Eclipse

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

                        • 从文件开头剪切 ,保存

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

                        ...不要再考虑使用 n...d 了!

                        【讨论】:

                          【解决方案20】:

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

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

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

                          AddDefaultCharset ISO-8859-1
                          

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

                          【讨论】:

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

                            【讨论】:

                              【解决方案22】:

                              这对我有用!

                              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
                              

                              【讨论】:

                                【解决方案23】:

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

                                也许它会起作用。

                                【讨论】: