我必须进行以下设置:Ubuntu 12.04、Mathematica 9 和 IntelliJIDEA 12。每次我从 Mathematica 复制一些文本并将其粘贴到 IDEA 中时,粘贴文本的末尾都会有很多额外的字节。最初似乎是 IDEA 中的错误现在似乎是 java 本身的错误。我附加了一个显示行为的最小 java 示例。
因此,当我Plot
在 Mathematica 中键入时,选择并复制它,然后运行示例,我得到以下输出,其中第一行是打印的表单,第二行是字节:
正如你所看到的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();
}
}
}
评论中要求的更多信息
可以在从 Mathematica 复制操作后查看剪贴板内容吗?
当然。不幸的是,它绝对没有返回任何东西。例如,当我从浏览器中标记并复制以下内容时,例如“这里”,我得到
patrick@lenerd:~$ xclip -out | hexdump -C
00000000 74 68 69 73 20 68 65 72 65 |this here|
00000009
编辑
我尝试了以下事情,我总是使用来自Mathematica的相同复制的“Plot”字符串。首先,我尝试了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
需要注意的是,当我不使用verbose
输出时xclip
,我只会在终端中看到“绘图”。在上面,您会看到缓冲区中恰好还有 4 个字节可能未显示,因为它们以00
. 此外,字节的额外内容是00 00 00 00
,至少这是显示的内容。在java中,我们在第二个位置有一个7f
(或)。127
我想这一切都表明该错误来自Mathematica,因为它复制了缓冲区中的其他内容,而 Java 只是有点草率,因为它一开始就没有剪切00
。