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

How can I clean source code files of invisible characters?

提问人:deceze 提问时间:7/1/2009 最后编辑:TylerHdeceze 更新时间:1/31/2023 访问量:57788

问:

我有一个奇怪的问题:在我的 HTML/PHP 代码的某个地方,有一个隐藏的、看不见的字符,我似乎无法摆脱。通过从 Firebug 复制它并转换它,我将其识别为“零宽度无间断空格”。它在我的网站中显示为非空文本节点,并导致严重的布局问题。

问题是,我无法摆脱它。即使打开隐形人,我也在我的文件中看不到它(呃)。我似乎找不到它,似乎没有搜索工具可以发现它。我重写了我的代码,但它似乎在其中一个框架文件的更深处。

我怎样才能通过跨文件的字符码或类似的东西来查找字符?我对不同的工具持开放态度,但它们必须在 Mac OS X 上运行。

Unicode 字符

评论

0赞 MSalters 7/2/2009
不要太自责。如果布局由于零宽度、不间断空间而中断,则渲染器误解了 sero-width 或非中断部分。
2赞 deceze 7/3/2009
我想这是值得商榷的。不间断空格连接了两个适当的空格字符,所以它应该呈现我猜的东西。而且有些东西碰巧被压在两个全宽、无边距的 DIV 之间,这就是为什么它出现得非常突出的原因。我宁愿责怪Microsoft一开始就发明了 BOM。;-)
0赞 da5id 7/1/2009
我很确定 Textwrangler 会做到。编辑:VersionTracker链接作为Bare Bones网站似乎再次关闭。
0赞 Matthew Scharley 7/1/2009
vi 或 vim 将显示任何非 EOL 字符。
1赞 Machavity 5/24/2021
清理了一些简单的答案并进行了编辑。看起来与主题一致,没有明确的工具请求

答:

3赞 Umair Ahmed 7/1/2009 #1

在 Notepad++ 中,有一个显示所有字符的选项。从顶部菜单:

视图 -> 显示符号 -> 显示所有字符

评论

1赞 deceze 7/1/2009
如前所述,我更在寻找Mac OS X(或UNIX)工具。
0赞 Umair Ahmed 7/1/2009
是的,我错过了......我想我看到了一些可以使用 Crossover 运行的地方。虽然不是很好的解决方案
0赞 Boldewyn 7/1/2009
顺便说一句:Notepad ++有一个选项,可以在没有BOM的情况下保存Unicode文件。以防万一你要切换到 Windows ;-)
0赞 Randy L 8/14/2010
我使用 wine 在 Ubuntu 上运行 Notepad++。我不知道 wine 是否在 OS X 上运行。
0赞 ClearBlueSky85 5/5/2016
我不认为记事本加加号会显示“无换行空格”和其他空格字符,尽管它会显示回车符和换行符......我认为您必须进行开关编码,这在公认的答案中进行了解释
2赞 Craig McQueen 7/1/2009 #2

我不是 Mac 用户,但我的一般建议是:当所有其他方法都失败时,请使用十六进制编辑器。在这种情况下非常有用。

参见维基百科中的“十六进制编辑器的比较”。

评论

0赞 TylerH 5/24/2021
即使在工具请求问题答案中,这个问题也不是特别有用,因为它没有提出解决方案甚至工具,只是一类工具。
50赞 Boldewyn 7/1/2009 #3

您不会在编辑器中获取该字符,因为您无法在文本编辑器中找到它。#FEFF 或 #FFFE 是所谓的字节顺序标记。它们是 Microsoft 的一项发明,用于在 Unicode 文件中讲述,多字节字符的存储顺序。

要删除它,请告诉您的编辑器将文件保存为 ANSI/ISO-8859 或不带 BOM 的 Unicode。如果你的编辑器不能这样做,你要么不得不切换编辑器(可悲的是),要么使用某种截断工具,例如,十六进制编辑器,让你看到文件的真实外观。

在谷歌搜索上,TextWrangler 似乎具有“UTF-8,无 BOM”模式。否则,如果你对终端感到满意,你可以使用 Vim:

:set nobomb

并保存文件。普雷斯托!

字符始终是文本文件中的第一个字符。正如我所提到的,支持 BOM 的编辑根本不会向您展示它。

评论

0赞 deceze 7/1/2009
我以前见过,但它通常在页面顶部呈现为垃圾。当它在页面中间时似乎更难找到......?无论如何,谢谢!:)
0赞 Boldewyn 7/1/2009
当您将 PHP 的 include 语句与要包含的 BOM 启动文件一起使用时,它可能会发生在页面中间。否则,它通常不会出现(尽管它标准的 Unicode 字符,可以这样使用)。
0赞 Wim ten Brink 7/1/2009
如果您使用 Altova XMLSpy 编辑 HTML/PHP 代码,则可以在菜单“工具/选项”选项卡页“编码”中找到关闭 BOM 的选项。如果 XMLSpy 找到 BOM,它可以保留它,或者在它尚不存在时将其添加到文件中。它没有删除 BOM 的选项。
0赞 Wim ten Brink 7/1/2009
哦,哎呀。我不知何故怀疑您是否在 Mac OS X 上使用 XMLSpy,尽管它可以通过使用“Parallels for Mac”虚拟化安装在 Mac OS X 上。
0赞 d0rf47 3/16/2022
哇哇哇,你刚刚为我节省了这么疯狂的时间。我真的不敢相信这一点。我看到被渲染为 HTML,但在 HTML 文件中的任何地方都找不到它,并且非常困惑。谢谢谢谢,谢谢!!
7赞 Vexatus 7/1/2009 #4

这是一个字节顺序标记。在“Mac OS X:打开终端窗口”下,转到您的来源并键入:

grep -rn $'\xFEFF' *

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

评论

0赞 Boldewyn 7/1/2009
由于它几乎可以肯定是文件的前两个字节,因此问题在于将其删除。我对 awk 不是很有经验,但它应该是一行式的,用于删除文件的前两个字节。
0赞 tripleee 5/24/2021
事实上,不难找到重复的问题,告诉你如何做到这一点。awk 'NR==1 { sub(/^\357\273\277/, "") } 1' file >newfile
15赞 Mirko 6/21/2010 #5

如果您使用的是 Textmate,并且问题出在 UTF-8 文件中:

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

它每次都对我有用。

0赞 MetropolisCZ 6/17/2022 #6

我知道现在回答这个问题有点晚了,但我正在添加如何在 Visual Studio 中更改编码,希望它对将要阅读本文的人有所帮助:

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