Java SystemClipboard 包含额外的字节

标签 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();
    }
  }
}

评论中要求的更多信息

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

重要的是要注意,当我不使用 xclipverbose 输出时,我只会在终端中看到“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 获得)似乎表明它只是调用了 XFetchBuffermemcpy(不完全确定)获取字节,然后对这些调用 fwrite,因此它会愉快地将 NUL 写入输出。

关于Java SystemClipboard 包含额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925547/

相关文章:

linux - 以可以在 SQL 的 IN 子句中使用的方式音译 unix 文件

wolfram-mathematica - 在Mathematica中绘制复杂函数

wolfram-mathematica - Mathematica 输出格式

java - 不论模式如何,在 map 中读取avro文件记录都会减少

java - 如果给定的查询参数无效或大小写不同,如何使 Spring MVC Controller 出错?

linux - 如何在前台运行 docker-compose start ?

c++ - 'fopen' 返回格式错误的 'fp'

wolfram-mathematica - 使用 Mathematica 识别时间序列中的重要最小值和最大值

java - STOMP Websocket同步通信使用Spring

java - 控制台空间