Java SystemClipboard包含其他字节

hal*_*tan 9 java linux wolfram-mathematica copy-paste

我必须遵循以下设置: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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

评论中要求提供更多信息

可以在从Mathematica复制操作后查看剪贴板内容吗?

当然.不幸的是,它绝不会返回.例如,当我在浏览器中标记并复制以下内容时,就像"这里"一样

patrick@lenerd:~$ xclip -out | hexdump -C
00000000  74 68 69 73 20 68 65 72  65                       |this here|
00000009
Run Code Online (Sandbox Code Playgroud)

编辑

我尝试了下面的东西,我总是使用Mathematica中复制的"Plot"字符串.首先,我按照评论中的建议尝试了大卫大型测试课程.有了这两个,Oracle JRE和Ubuntu附带的OpenJRE,我得到了以下输出:

===========
Plot[00][7f][00][00]
===========
Obtained transferrable of type sun.awt.datatransfer.ClipboardTransferable
Plot[00][7f][00][00]
===========
Run Code Online (Sandbox Code Playgroud)

从上面我的短狙击给出相同的结果(虽然不是十六进制表示).然后我尝试了不同的选择,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
Run Code Online (Sandbox Code Playgroud)

需要注意的是,当我不使用verbose输出时xclip,我只在终端中看到"Plot".上面,你看到缓冲区中还有4个字节可能没有显示,因为它们以a开头00.另外,字节的额外是00 00 00 00,至少这是显示的内容.在java中,我们有一个7f(或127)在第二个位置.

我想这一切都表明这个错误来自Mathematica,因为它在缓冲区中复制了额外的东西,而Java只是有点草率,因为它不会在第一次切割00.

Dav*_*fer 2

这些结论看起来很合理。

\n\n

如果找到以下有关 X 剪贴板行为的参考资料:

\n\n

X11r6 Inter-Client Communication Conventions Manual,特别是Peer-to-Peer Communication by Means of Selections,以及 Developer\xe2\x80\x99s 角落的更压缩的解释(和 Python 测试工具):在 Linux 中复制粘贴

\n\n

因此,数据“Plot[00][7f][00][00]”或者“Plot[00][00][00][00]”是 Mathematica 根据应用程序请求实际提供的数据“读取”剪贴板。我只能想象 Mathematica 说“这是带有八个字节的字符串”,并且读取应用程序尝试处理这个问题,读取实际字符数组的末尾。

\n\n

这也可能是 X 中的一个错误(但 Ubuntu 12.04 尚未使用 Mir,所以可能不会。)

\n\n

请注意,在 Java 中,字符串不是以 NUL 结尾的,并且“Plot[00][7f][00][00]”确实是一个有效的字符串。

\n\n

xclip快速浏览一下(在我的 Fedora 上获得的)源代码yumdownloader --source xclip似乎表明它只是调用XFetchBuffermemcpy(不完全确定)来获取字节,然后调用fwrite这些字节,因此它会很乐意将 NUL 写入输出。

\n