如何清理源代码文件中的不可见字符?

39

我有一个奇怪的问题:在我的HTML/PHP代码中,隐藏了一个看不见的字符,我似乎无法摆脱它。通过从Firebug复制并转换它,我确定它是或“零宽不换行空格”。它显示为非空文本节点,并导致严重的布局问题。

问题是,我无法摆脱它。即使在打开不可见字符时也看不到它(当然)。我似乎找不到它,没有搜索工具能够找到它。我已经围绕可能的位置重新编写了我的代码,但它似乎深藏在其中一个框架文件中。

我如何在多个文件中按字符代码查找字符?我可以使用不同的工具,但必须在Mac OS X上运行。


vi或vim将显示任何非EOL字符。 - Matthew Scharley
我相信Textwrangler可以做到。编辑:由于Bare Bones网站似乎再次出现问题,这里提供VersionTracker链接 - da5id
不要太责怪自己。如果布局因为零宽度的不间断空格而破坏,那么渲染器可能会误解零宽度或不间断部分。 - MSalters
2
我想这是有争议的。那个不间断空格连接了两个合适的空白字符,因此它应该会呈现某些东西吧。那个东西碰巧被挤压在两个全宽、无边距的DIV之间,这就是为什么它显得非常突出。我更倾向于责备微软最初发明BOM。;-) - deceze
1
清理了一些简单的答案并进行了编辑。看起来是关于主题的,没有明确的工具请求。 - Machavity
6个回答

50

因为在文本编辑器中找不到它,所以您无法在编辑器中获取字符。#FEFF或#FFFE被称为字节顺序标记。这是微软的发明,用于指示Unicode文件中多字节字符存储的顺序。

要删除它,请告诉您的编辑器将文件保存为ANSI / ISO-8859或无BOM的Unicode。如果您的编辑器不能这样做,您需要更换编辑器(遗憾)或使用某种截断工具,例如允许您查看文件真实外观的十六进制编辑器。

通过谷歌搜索,看起来TextWrangler有“UTF-8,无BOM”模式。否则,如果您熟悉终端,可以使用Vim:

:set nobomb

保存文件即可。完成!

在文本文件中,字符始终是最前面的。支持BOM的编辑器不会将其显示给您。


我之前看到过这个,但通常会在页面顶部呈现垃圾。当它在页面中间时似乎更难找到...?无论如何,谢谢! :) - deceze
它可能会出现在页面中间,当您使用带有BOM开头的文件进行PHP包含语句时。否则通常不应该出现(尽管它是一个标准的Unicode字符,可以作为这样使用)。 - Boldewyn
如果你正在使用Altova XMLSpy编辑你的HTML/PHP代码,那么关闭BOM选项可以在菜单"工具/选项"、选项卡"编码"中找到。XMLSpy可以在发现BOM时保留它,或者在文件不存在时添加它。它没有删除BOM的选项。 - Wim ten Brink
哦,糟糕。我有点怀疑你是否在 Mac OS X 上使用 XMLSpy,尽管可以通过使用“Parallels for Mac”虚拟化在 Mac OS X 上安装它。 - Wim ten Brink
哇哇哇,你刚刚为我节省了大量的时间。我真的无法相信这个。我看到被呈现为HTML,但在HTML文件中找不到它,感到非常困惑。谢谢谢谢谢谢! - d0rf47

15

如果你正在使用Textmate且问题出现在一个UTF-8文件中:

  1. 打开该文件
  2. 文件 > 使用编码重新打开 > ISO-8859-1 (Latin1)
  3. 你应该能够看到并删除文件中的第一个字符
  4. 文件 > 保存
  5. 文件 > 使用编码重新打开 > UTF8
  6. 文件 > 保存

我每次都能成功使用这种方法。


7
这是一个字节顺序标记。在Mac OS X下,打开终端窗口,进入您的源代码目录并输入:
grep -rn $'\xFEFF' *

它将显示包含BOM的行号和文件名。

由于它几乎肯定是文件的前两个字节,所以问题就是如何将其去掉。我对awk不是很熟悉,但使用它应该可以轻松地一行代码删除文件的前两个字节。 - Boldewyn
实际上,很容易找到重复的问题,这些问题向你展示了如何做到这一点。awk 'NR==1 { sub(/^\357\273\277/, "") } 1' file >newfile - tripleee

3
在Notepad++中,有一个显示所有字符的选项。从顶部菜单中选择:
视图 -> 显示符号 -> 显示所有字符

1
正如所述,我更倾向于寻找一个适用于Mac OS X(或UNIX)的工具。 - deceze
是的,我错过了那个...我想我在某个地方看到它可以使用Crossover运行。虽然不是很好的解决方案。 - Umair Ahmed
顺便说一下:Notepad++有一个选项可以保存没有BOM的Unicode文件。以防你要转换到Windows ;-) - Boldewyn
我在Ubuntu上使用Wine运行Notepad++。我不知道Wine是否可以在OS X上运行。不过Notepad++真的很棒。 - Randy L
我认为记事本++不会显示“不间断空格”和其他空白字符,尽管它会显示回车符和换行符... 我认为你必须切换编码,这在被接受的答案中有解释。 - ClearBlueSky85

2
我并不是Mac用户,但我的一般建议是:在其他方法都无法解决时,使用十六进制编辑器。在这种情况下非常有用。
请参见WikiPedia中的"十六进制编辑器比较"

即使在工具请求问题的回答中,这一个并不特别有用,因为它没有提出解决方案或工具,仅仅是一类工具的分类。 - TylerH

0

我知道回答这个问题有点晚了,但我想分享一下如何在Visual Studio中更改编码,希望对那些可能会在某个时候阅读此内容的人有所帮助:

  1. 转到文件 -> 另存为(你的文件名)...
  2. 在文件资源管理器窗口中,选择保存按钮旁边的小箭头 -> 点击“另存为编码...”
  3. 点击是(在“您要替换现有文件吗”对话框上)
  4. 最后选择例如Unicode(UTF-8无签名)-这将删除BOM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接