我必须进行以下设置:Ubuntu 12.04、Mathematica 9 和 IntelliJIDEA 12。每次我从 Mathematica 复制一些文本并将其粘贴到 IDEA 中时,粘贴文本的末尾都有很多额外的字节。什么先appeared to be a bug in IDEA现在似乎是 java 本身的一个错误。我附加了一个显示行为的最小 java 示例。
因此,当我在 Mathematica 中键入 Plot
时,选择并复制它,然后运行该示例,我得到以下输出,其中第一行是打印形式,第二行是字节:
如您所见,Plot
后跟一个 0
字节和一些其他字节,不一定是零字节。在我所有的测试中,我发现一个有效的解决方案是使用字符串直到找到第一个 0
,但这并没有解决根本问题。我真的很想看到这个问题得到解决,因为我经常在 Mathematica 和 IntelliJIDEA 之间复制代码,但首先我需要知道谁应该为此负责。
问题:
我如何才能确定是 Mathematica 还是 Java 在这里做错了什么?我可以将 Mathematica 内容复制到不同的编辑器、浏览器等,但我从未见过这样的事情。另一方面,我也从未发现 IntelliJ (Java) 复制浪费。找出 Mathematica 是否错误使用剪贴板或 Java 有错误的好方法是什么?
最小示例
在 Mathematica 中选择一些文本,按 Ctrl+C 并运行以下命令
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
public class CopyPasteTest {
public static void main(String[] args) {
final String text;
try {
final Clipboard systemClipboard =
Toolkit.getDefaultToolkit().getSystemClipboard();
text = (String) systemClipboard.getData(DataFlavor.stringFlavor);
System.out.println(text);
for (byte a : text.getBytes()) {
System.out.print(a + " ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
评论中要求的更多信息
Could just take a look at the clipboard contents after the copy-from-Mathematica operation?
当然。不幸的是,它什么也没有返回。例如,当我从浏览器中标记并复制以下内容时,比如“这里”,我得到了
patrick@lenerd:~$ xclip -out | hexdump -C
00000000 74 68 69 73 20 68 65 72 65 |this here|
00000009
编辑
我尝试了以下操作,其中我始终使用从 Mathematica 复制的相同“Plot”字符串。首先,我尝试了 larger test-class from David正如他的评论中所建议的那样。使用 Ubuntu 附带的 Oracle JRE 和 OpenJRE,我得到了以下输出:
===========
Plot[00][7f][00][00]
===========
Obtained transferrable of type sun.awt.datatransfer.ClipboardTransferable
Plot[00][7f][00][00]
===========
我从上面截取的短片给出了相同的结果(尽管不是十六进制表示)。然后我尝试了来自 xclip
的不同选择,并使用值 clipboard
带来了后续
patrick@lenerd:~$ xclip -o -verbose -selection clipboard | hexdump -C
Connected to X server.
Using selection: XA_CLIPBOARD
Using UTF8_STRING.
00000000 50 6c 6f 74 00 00 00 00 |Plot....|
00000008
重要的是要注意,当我不使用 xclip
的 verbose
输出时,我只会在终端中看到“Plot”。在上面,您看到缓冲区中恰好还有 4 个字节可能没有显示,因为它们以 00
开头。此外,字节的额外部分是 00 00 00 00
,至少这是显示的内容。在 java 中,我们在第二个位置有一个 7f
(或 127
)。
我想这一切都表明该错误来自 Mathematica,因为它在缓冲区中复制了额外的东西,而 Java 只是有点马虎,因为它没有在第一个 00
.
最佳答案
这些结论看起来很合理。
如果找到以下有关 X 剪贴板行为的引用资料:
X11r6 Inter-Client Communication Conventions Manual , 特别是 Peer-to-Peer Communication by Means of Selections ,还有一个更压缩的解释(和 Python 测试工具)在 Developer’s corner: copy-paste in Linux
因此,数据“Plot[00][7f][00][00]”或“Plot[00][00][00][00]”是 Mathematica 根据要求实际提供的数据到“读取”剪贴板的应用程序。我只能想象 Mathematica 说“这是八个字节的字符串”,读取应用程序试图处理这个问题,读取实际字符数组的末尾。
它也可能是 X 中的一个错误(但 Ubuntu 12.04 还没有使用 Mir,所以可能不是。)
请注意,在 Java 中,字符串不是以 NUL 结尾的,“Plot[00][7f][00][00]”确实是一个有效的字符串。
快速浏览一下 xclip
的源代码(在我的 Fedora 上使用 yumdownloader --source xclip
获得)似乎表明它只是调用了 XFetchBuffer或 memcpy
(不完全确定)获取字节,然后对这些调用 fwrite
,因此它会愉快地将 NUL 写入输出。
关于Java SystemClipboard 包含额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925547/