【问题标题】:Sublime Text / code parse error for no reason, hidden charactersSublime Text/code 无故解析错误,隐藏字符
【发布时间】:2014-04-08 21:15:22
【问题描述】:

我多年来一直遇到这个问题,但不像今天那么频繁。这促使我一劳永逸地问这个问题。

有时(今天几乎所有逻辑)我的琐碎 PHP 代码会因解析错误而失败。有时 PHP 是正确的,但通常不会出错,并且当再次编写完全相同的代码时,它可以毫无怨言地工作。复制粘贴代码不起作用,必须重新输入完​​整的代码。

今天,我仔细地输入了每一个字符,完全按照失败的行,然后删除了旧的,只是为了让脚本正常工作。例如:

1    foreach ($_POST['data_positions'] AS $k => $v) {
2    
3    }

在第 1 行引发了一个解析错误。我将代码向下移动到第 2 行并再次编写完全相同的第 1 行(我多次检查每个字符是否相同),然后删除第 2 行,它可以工作。另一个例子:

1    if (is_numeric($k)) {
2    
3    }

在第 1 行也失败了。当我重新输入它时,它可以工作。再次复制粘贴行不行。

我 100% 确定代码没有问题,因此这让我相信这是某种编码问题,并且代码的某些部分归因于错误的编码(例如将格式化的文本粘贴到电子邮件中)。

我目前正在使用 Sublime Text(但在 Notepad++ 和旧的 Homesite 编辑器中也有相同类型的错误解析错误),在 OS X 上运行 MAMP,但它也发生在我的 Windows 台式机上。

有人知道我能做什么吗?多次编写代码并随机失败,非常烦人。

编辑(重新打开): 我仍然无法让它正常工作。无论我将它粘贴到记事本还是从头开始键入一个全新的文件。我已经检查了从数据库到服务器到我的编辑器的所有内容,它们都使用 UFT-8。几乎总是 IF 语句会中断(有时我必须将它们输入 3 或 4 次才能起作用。琐碎的东西,例如 if ($a === 3 || $a === 6) {}

编辑(已解决!): 向下滚动查看解决方案,我自己回答了问题。

【问题讨论】:

  • 您在不知不觉中粘贴了导致此解析错误的隐藏字符
  • 使用十六进制编辑器查找您可能无意中输入的恶意隐形字符。据我所知,如果您使用不受支持的编码(例如 UTF-16),PHP 解释器将无法按原样查找代码和输出文件。
  • 这些行号是否存在?可能是一些 unicode “不可见”字符(在奇怪的编辑器中)?
  • @AlmaDo 不,我自己在这里添加它们只是为了澄清。

标签: php parsing syntax-error sublimetext2 sublimetext3


【解决方案1】:

我终于找到了答案。我必须通过反复试验找出我做错了什么。

所以,如果您的代码由于隐藏字符而中断,如果您在从 UTF-8 切换到 ISO-8859-1 时发现该字符是“”,如果它主要发生在 OSX 和多个编辑器中(两者Sublime Text 和 Coda 对我来说)这可能就是原因:

在许多操作系统中,当您按alt+space 时,您会得到一个不间断的空格而不是正常空格。许多编程解析器(例如 PHP、Xcode)在解析该字符时会失败。

要在 Sublime Text 中修复它,您需要编辑 Preferences/Key bindings - User 并添加以下行:

{ "keys": ["alt+space"], "command": "insert_snippet", "args": {"contents": " " } },

请记住,键绑定文件是一个包含对象的数组,如果您有更多条目,则需要在末尾保留,。如果是最后一个,请将其删除。

如果您需要在任何其他编辑器中修复它,只需 Google 搜索“yourEditor disable alt space”。

编辑:

我还注意到alt+shift+space 的行为相同,因此我在键绑定配置中添加了另一行:

{ "keys": ["alt+shift+space"], "command": "insert_snippet", "args": {"contents": " " } },

:)

【讨论】:

  • 非常感谢您。只是为了记录,有/曾经有一个包在红色背景中突出显示这些字符(utf8 中的空格不是简单的 0x20 空格字符)。
【解决方案2】:

您在不知不觉中粘贴了导致此解析错误的隐藏字符。可能它是您复制的代码源,其中包括剪贴板中的这些隐藏字符。或许你应该使用notepad 去掉这些隐藏字符:

  1. 从源代码复制
  2. 将其粘贴到记事本中
  3. 从记事本复制
  4. 粘贴到您选择的代码编辑器中

this 在您使用 sublime 文本时可能会有所帮助

【讨论】:

  • 问题是,我几乎总是手动编写所有代码,但我猜我的数据库连接、html 标头代码等基本内容通常取自我的其他旧文件。
  • 那么可能是你的旧文件导致了这个问题
  • Soni,我仍然无法正常工作。无论我将它粘贴到记事本还是从头开始键入一个全新的文件。我已经检查了从数据库到服务器到我的编辑器的所有内容,它们都使用 UFT-8。中断的几乎都是 IF 语句。
【解决方案3】:

我知道您已经接受了自己的答案,但为了将来参考,我不建议将您的代码保存在编码为 UTF-8 的文件中。

在编写 PHP 或任何其他代码时,我只会使用普通的旧 ASCII。使用任何其他编码可能会导致意想不到的事情发生 - 正如您已经发现的那样。

即使您的代码生成的输出是您想要编码为 UTF-8 的网页,也请为您的代码文件使用 ASCII。您的代码文件的编码和这些代码文件生成的页面的编码是两个不同的东西。

【讨论】:

  • 感谢您的加入。我明白你在说什么,你很可能是对的,但是如果你在开发的各个方面(从文件到数据库模式)都使用 UTF-8,那么你会惊讶于人们所说的已解决的问题数量。 UTF-8 通常也是默认设置,所以我想需要一个像提议的那样的“解决方案”。
  • 我完全同意 UTF-8 是适用于几乎所有内容的最佳方式,但不适用于您的源代码文件。
猜你喜欢
  • 2021-08-22
  • 2021-08-12
  • 2015-04-29
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多