PHP删除了所有空格,因此代码中间的随机正如我提到的那样,当我在gedit中打开文件时,实际上看不到这些字符,因此我无法非常轻松地删除它们。
我在问题上进行了搜索,显然存在问题文件编码,这很有意义,因为我一直在通过一系列文本编辑器通过ftp和rsync将文件转移到不同的Linux / Windows服务器。我对字符编码的了解不多,因此不胜感激。
如果有用,该文件将以UTF-8格式保存,而gedit不会让我保存它格式为ISO-8859-15(文档包含一个或多个无法使用指定的字符编码进行编码的字符)。我尝试使用Windows和Linux行尾保存它,但都没有帮助。
#1 楼
为您提供三个词:字节顺序标记(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年7月15日在13:38
它不会删除BOM,而会忽略它。
–科尔·约翰逊(Cole Johnson)
2013年6月23日22:19在
或者另一种方法(忽略)可以更改编码。
–mr5
2015年10月21日,3:20
Windows记事本(ugh)添加了它们;这个问题的重复建议使用Notepad ++,它允许将“无BOM的UTF-8”设置为编码。或使用Real Editor ...(emacs!):-)
–jesup
16年2月12日在15:26
这就是问题所在,不同的字符编码对相同的字符使用不同的字节。再次阅读答案的第三段。
– Vinko Vrsalovic
17-10-7在17:18
#2 楼
在记事本++中打开文件。从“编码”菜单中,选择“转换为不带BOM的UTF-8”,保存文件,然后用此新文件替换旧文件。该死的,肯定会的。评论
在Notepad ++ v7.6.6(64位)中,您需要单击“转换为UTF-8”。
–造口术
19年5月15日在7:05
#3 楼
在PHP中,您可以执行以下操作以删除所有非字符,包括有问题的字符。$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
评论
如果您只是想杀死“ï”,请使用此$ response = preg_replace('/ [\ x80- \ xFF] //','',$ response);
– Guido _nhcol.com.br_
17年6月8日在20:49
@ guido_nhcol.com.br_您添加了一个额外的/,它应该是:$ response = preg_replace('/ [\ x80- \ xFF] /','',$ response);
– H Aßdøµ
19年7月16日在7:41
#4 楼
对于具有外壳访问权限的用户,这是一个小命令,用于查找在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'。忽略二进制文件。
– Nabi K.A.Z.
2015年3月11日在16:56
#5 楼
BOM只是一个字符序列(对于UTF-8,是$ EF $ BB $ BF),因此只需使用脚本将其删除或配置编辑器,这样就不会添加。从从UTF-8删除BOM中:
#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);
我相信它可以轻松地转换为PHP。
评论
请注意,BOM不是字符序列,而是单个字符。如果文件使用UTF-8,则该字符用三个字节表示。如果文件采用UTF-8格式,则以另一种编码方式(即EF BB BF出现在BOM所在的位置)查看该文件是错误的。要从UTF-8文件中删除物料清单,应删除(单个)字符U + FEFF。是的,修脚!
– Jeffrey L Whitledge
2010年7月15日在14:05
我无法在PHP中使用它(这只是我的能力,不是您的:P),因此我进行了检查以查看BOM是否存在并删除了前3个字符。这是代码,如果有人需要的话:if(substr($ css,0,3)== pack(“ CCC”,0xef,0xbb,0xbf)){$ css = substr($ css,3); }
–马特
2010年7月15日在14:08
它转换为php $ string = preg_replace('/ \ x {EF} \ x {BB} \ x {BF} /','',$ string); 。在使用此功能之前,请重新考虑是否无法从源头上解决问题。
–commonpike
2011年10月6日15:53
#6 楼
对我来说,这可行:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
如果我删除此meta,则会再次出现。希望这对某人有帮助...
#7 楼
我不知道PHP,所以不知道这是否可行,但是最好的解决方案是将文件读取为UTF-8而不是其他某种编码。 BOM实际上是零宽度的中断空间。这是空格,因此,如果以正确的编码(UTF-8)读取文件,则BOM将被解释为空格,并且在生成的CSS文件中将被忽略。此外,以正确的编码读取文件的另一个优点是,您不必担心字符会被误解。编辑器告诉您要保存在其中的代码页不会执行所需的所有字符。如果PHP随后以错误的编码方式读取文件,则很有可能除BOM之外的其他字符都被默默地误解了。随处使用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 set fileencoding = utf-8 | set encoding = utf-8 |设置炸弹| wq'评论
使用grep -rlI $'\ xEF \ xBB \ xBF'。忽略二进制文件。并且 。最好*在这里。
– Nabi K.A.Z.
2015年3月11日在16:59
#10 楼
我的一些PHP文件中出现BOM表时也遇到了同样的问题(。)。如果您使用PhpStorm,则可以通过热键进行设置,以在Settings-> IDE Settings中将其删除。 ->键映射->主菜单->文件->删除BOM。
#11 楼
在Notepad ++中,选择“编码”菜单,然后选择“在没有BOM的UTF-8中编码”。然后保存。请参阅堆栈溢出问题。如何使记事本在没有BOM的情况下以UTF-8保存文本?
#12 楼
在Notepad ++中打开有问题的PHP文件。单击顶部的编码,然后从“在没有BOM的UTF-8中编码”更改为“在UTF-8中编码”。保存并覆盖服务器上的文件。
#13 楼
同样的问题,不同的解决方案。PHP文件中的一行正在打印出XML标头(使用与PHP相同的begin / end标签)。看起来这些标签中的代码设置了编码,并在PHP中执行,导致产生了奇怪的字符。两种方法都可以解决此问题:
# Original
$xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";
#14 楼
如果您需要能够从UTF-8编码的文件中删除BOM,则首先需要拥有一个了解它们的编辑器。我个人使用E文本编辑器。
右下方有字符编码选项,包括BOM标签。加载文件,取消选择“字节顺序标记”(如果已选择),然后重新保存,应该完成。
替代文本http://oth4.com/encoding.png
E不是免费的,但有一个免费试用版,并且它是出色的编辑器(与TextMate兼容的限制)。
评论
图像链接已断开。
– Peter Mortensen
15年5月9日在16:53
#15 楼
您可以通过PhpStorm打开它,然后右键单击您的文件,然后单击“删除BOM” ...#16 楼
这是解决BOM表问题的另一个好方法。这是两个VBScript(.vbs)脚本。一个用于在文件中查找BOM的文件,另一个用于在文件中杀死该损坏的BOM的脚本。它工作得很好并且易于使用。
只需创建一个.vbs文件,然后将以下代码粘贴到其中即可。
只需拖动即可使用VBScript脚本并将可疑文件拖放到.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文件,然后将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}
(正则表达式)而不进行任何替换。#18 楼
同样的问题,但是它只影响一个文件,因此我只创建了一个空白文件,将代码从原始文件复制/粘贴到新文件,然后替换了原始文件。不花哨,但有效。#19 楼
使用Total Commander搜索所有BOM表文件:用BOM表搜索UTF-8文件的简便方法?
在适当的编辑器中打开这些文件(
将文件的编码更改为ISO(右键单击属性)。
从文件开头剪切,保存
将文件的编码更改回UTF-8
...,甚至不要考虑再次使用n ... d!
#20 楼
我有同样的问题。问题是因为我的一个php文件在utf-8中(最重要的是,所有php文件中都包含了配置文件)。我有两种不同的解决方案对我来说:
首先,我通过在配置文件(或.htaccess)中使用AddDefaultCharsetDirective更改了Apache配置。此解决方案强制Apache使用正确的编码。
AddDefaultCharset ISO-8859-1
第二种解决方案是更改php文件的错误编码。
#21 楼
复制filename.css文件的文本。
关闭css文件。
重命名filename2.css以避免文件名冲突。
在MS记事本或Wordpad中,创建一个新文件。
将文本粘贴到其中。
将其另存为filename.css,并从编码选项中选择UTF-8。
上传filename.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
”。也许可以。
评论
这似乎解决了问题。 95isalive.com/expression/index.html有人剥夺了我们的BOM
stackoverflow.com/q/20778921/995714