Error message "error: stray '\302' in program"

10

我正在使用Code::BlocksUbuntu 10.10(Maverick Meerkat)上。我连接了一个Mac键盘,并将键盘设置为“Swiss German Mac”。现在,每当我打一个等号,后面跟着一个空格(类似于width = 100)时,我会收到错误消息:stray '\302' in program。

我知道这个错误意味着文本文件中有非标准字符。

当我删除空格字符时,程序就可以正常编译。所以这意味着Code::Blocks添加了某种特殊字符。但我不知道为什么会发生这种情况。是什么原因导致这种情况发生?

'\302'代表什么字符?

[更新]

我进一步调查了这个问题。我在使用Shift + Space组合键时会遇到这个问题。现在我知道它不再经常发生了。但是在编写代码时仍然相当烦人...有没有办法在X11中关闭这个组合键?

[已解决]

感谢Useless的答案,我能够解决这个“问题”。其实这更像是一个功能。Shift + space默认会创建一个没有换行符的空格。所以通过更改xmodmap

xmodmap -e "keycode  65 = space space space space space space"

这种行为被覆盖了,现在一切运行良好。


你是不是漏掉了什么(stray \240)?这些字符通常形成一个单元(由两个或三个字节的 UTF-8 字节序列组成)。\240 是 NO-BREAK SPACE 的签名。可能的序列是 302 240(八进制)→ 0xC2 0xA0(十六进制)→ Unicode 代码点 U+00A0(NO-BREAK SPACE)的 UTF-8 序列。 - Peter Mortensen
大多数文本编辑器(例如Geany(Linux和Windows)和[Notepad++](https://en.wikipedia.org/wiki/Notepad%2B%2B))都具有[正则表达式](https://en.wikipedia.org/wiki/Regular_expression)模式,可以使用`\x {00A0}`搜索/替换Unicode代码点U + 00A0。 - Peter Mortensen
这个回答解决了您的问题吗?[编译错误:程序中的杂项‘\302’等](https://dev59.com/ymIk5IYBdhLWcg3wg-fK) - Karl Knechtel
或者它实际上只是\240(CE/CP-1250)而不是UTF-8。 - Peter Mortensen
9个回答

7

既然您确定是因为按下了Shift + Space引起的问题,那么您可以通过检查X本身的操作进行排查。首先,在命令行中运行xev,然后按下Shift+Space并检查输出。例如,我看到:

$ xev
KeyPress event, serial 29, synthetic NO, window 0x2000001,
    root 0x3a, subw 0x0, time 4114211795, (-576,-249), root:(414,593),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 29, synthetic NO, window 0x2000001,
    root 0x3a, subw 0x0, time 4114213059, (-576,-249), root:(414,593),
    state 0x1, keycode 65 (keysym 0x20, space), same_screen YES,
    XLookupString gives 1 bytes: (20) " "
    XmbLookupString gives 1 bytes: (20) " "
    XFilterEvent returns: False
...

然后运行xmodmap -pk并查找键码(空格应为65,但请检查您的xev输出)。

如果您看到类似以下内容:

65         0x0020 (space)

那么 X 并没有做到这一点。另一方面,如果我选择一个由 shift 修改的字符键,我会看到类似这样的东西:

58         0x006d (m)      0x004d (M)

如果您的按键码有两个或更多个键符号,那么 X 就是罪魁祸首。在这种情况下,类似 xmodmap -e 'keycode 65 space' 的命令应该可以解决问题。

@underdoeg - 很高兴听到这个消息!有没有详细记录的信息? - Useless
抱歉,我太晚看到你的答案了。现在我不能再申请赏金了吗?我会尽快发布详细信息! - underdoeg

7

\302 代表编译器遇到的字节值的八进制表示。它的二进制表示为11000010,这让我想到它是一个两个字节的UTF-8序列的起始。然后这个序列必须是:

11000010 10??????

这个编码将二进制Unicode点10??????进行编码,可以是从U+80到U+BF的任何内容。

从U+80开始的几个字符是特殊的空格和换行符,通常不会在文本编辑器中显示。

可能不是您的编辑器,而是Xorg根据您的键盘设置发出这些字符。尝试切换到通用的美国键盘并测试问题是否仍然存在。


你好。这个话题现在有点老了。但是你说得对,当我按下ctrl + space时它确实发生了。我现在可以解决这个问题。但是在编程时,像“int a = 10”这样的行中仍然经常发生这种情况。你知道我怎么在X11中禁用这个特定的键组合吗? - underdoeg
很遗憾,不行。您可以编辑您的问题,告诉其他人您已经做了多少工作,以便再次引起他们的注意。 - Tugrul Ates
\302 是194,因此不是一个双字节序列。 - Yakov Galka
@ybungalobill 首位为1的字节是UTF-8序列的一部分。 - Tugrul Ates
啊,抱歉。我误解了你的意思。 - Yakov Galka
显示剩余2条评论

1
我曾经遇到过从网页或其他电子文档中复制和粘贴时出现此类问题的情况。常见的罪犯可能是无效的引号,例如 \` 而不是 ',或者类似的内容。尝试使用编译器错误指导你找到文件中出错的位置。

谢谢。我知道错误在文件中的哪里,我得到了一个带有行号和其他信息的不错的偏差错误。现在我尝试做的是简单地停用这个键组合:shift + space。 - underdoeg
确实。我遇到了一个问题,从这个页面复制代码时出现了一个零宽空格。在文本编辑器中使用正则表达式模式进行搜索/替换\x{200B}即可消除它。 - Peter Mortensen
他们现在已经更改了该页面(以及相应的未损坏链接),因此不再导致此错误。 - Peter Mortensen

0

我在我的Linux电脑上使用芬兰键盘时遇到了这个问题。

这也会发生在Emacs等软件中。我没有一个好的解决方案,但我猜想关于它在其他地方也发生的报告也是有用的...


1
请注意,当在芬兰键盘上输入需要按下alt-gr键的字符(如{[]})时,可能会出现此类情况。这些字符在尝试编译代码之前几乎是不可见的。 - tp1
1
不,对我来说是使用 shift 和空格键,因为我用的是瑞士键盘。所以我也必须按 alt 键来输入 {[]},但从未遇到任何问题... - underdoeg

0
如果您在Emacs中打开文件并将set-buffer-file-coding-system设置为类似于“unix”或某些ASCII变体的内容,那么当您尝试保存时,它会警告您缓冲区包含不可表示的字符,并指向这些字符,以便您可以修复它们。

0

我决定将文件从MacBook移动到Linux盒子,并使用我的iCloud地址发送电子邮件。当我打开传输的文件时,错误已经消失了,文件编译成功!


0

听起来像某种编码问题。我已经多年没有使用 Code::Blocks 了,所以我不确定它是否允许您选择不同的编码。

你可以尝试用 gedit 打开你的代码文件并保存为 UTF-8,然后再试一次怎么样?但是很奇怪你会在使用空格字符时遇到这样的问题。


打开和重新保存不起作用。特殊字符仍然留在文件中。这可能是某种特殊间距。 - underdoeg

0

'\302' 是 C 语言中表示八进制数 3028 的符号,它等于十六进制数 C216 和十进制数 19410。因此它不是 ASCII 码。

它所映射的字符取决于编码方式。例如在 Latin-1 编码中,它代表的是 Â 字符。


他很可能忽略了下一个杂散错误消息(\240)。这将是302 240(八进制) → 0xC2 0xA0(十六进制) → Unicode代码点U+00A0(NO-BREAK SPACE)的UTF-8序列。 - Peter Mortensen

0

我曾经遇到过同样的问题,当时我修改了一个美国ASCII示例文件。所以我将其转换为UTF-8格式,以下是GNU/Linux命令:

iconv -c -t us-ascii -f utf-8 source_file -o dest_file

然后添加我的修改...没有更多的错误!

要验证初始编码,请使用

file -i source_file

我应该添加一个非ASCII字符,以便iconv能够完成工作!?


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