9

我必须进行以下设置: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

4

3 回答 3

2

这些结论看起来很合理。

如果发现以下有关 X 剪贴板行为的参考:

X11r6 Inter-Client Communication Conventions Manual,特别是Peer-to-Peer Communication by Means of Selections,以及开发者专区的更压缩解释(和 Python 测试工具):Linux 中的复制粘贴

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

它也可能是 X 中的一个错误(但 Ubuntu 12.04 还没有使用 Mir,所以可能没有。)

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

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

于 2013-11-19T08:20:28.593 回答
0

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

text = (String) systemClipboard.getData(DataFlavor.stringFlavor);
text = text.trim();
System.out.println(text);
于 2013-11-14T21:21:40.187 回答
0

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

作为一种解决方法,我建议

test.replaceFirst("\u0000(?s:.*)", "");
于 2013-11-18T10:57:48.800 回答