Java SystemClipboard包含其他字节

时间:2013-11-12 09:35:57

标签: java linux wolfram-mathematica copy-paste

我必须遵循以下设置:Ubuntu 12.04,Mathematica 9和IntelliJIDEA 12.每次我从Mathematica复制一些文本并将其粘贴到IDEA中时,粘贴文本的末尾会有很多额外的字节。首先appeared to be a bug in IDEA现在看起来更像是java本身的一个错误。我附加了一个显示行为的最小java示例。

因此,当我在Mathematica中键入Plot时,选择并复制它,然后运行示例我得到以下输出,其中第一行是打印形式,第二行是字节:

enter image description here

正如您所看到的,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”字符串。首先,我按照他的评论中的建议尝试了larger test-class from David。使用Oracle JRE和Ubuntu附带的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输出时,我只在终端中看到“Plot”。在上面,您会看到缓冲区中恰好还有4个字节可能未显示,因为它们以00开头。另外,字节的额外值是00 00 00 00,至少这是显示的内容。在java中,我们在第二个位置有7f(或127)。

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

3 个答案:

答案 0 :(得分:2)

这些结论看起来很合理。

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

X11r6 Inter-Client Communication Conventions Manual,特别是Peer-to-Peer Communication by Means of Selections,以及Developer’s corner: copy-paste in Linux

上更加压缩的解释(以及Python测试工具)

因此,数据“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获得)似乎表明它只是调用XFetchBuffermemcpy(不完全确定)获取字节,然后在那些上调用fwrite,这样就可以很好地将NUL写入输出。

答案 1 :(得分:0)

这看起来像字符串结束字符的一些问题(我有类似的问题与c ++ dll修改的数据,并通过外部系统发送)。我不知道如何解决这个问题,但我认为你可以通过简单的解决方法来删除无效的字符 - 对文本的简单调用trim()方法。

text = (String) systemClipboard.getData(DataFlavor.stringFlavor);
text = text.trim();
System.out.println(text);

答案 2 :(得分:0)

我猜,它是零终止的“c-style”字符串,并且在Matematica和Java之间存在一些误解。我会在Linux论坛上的某个地方询问剪贴板应该如何工作。

作为解决方法,我建议

test.replaceFirst("\u0000(?s:.*)", "");