我不得不遵循如下设置:Ubuntu 12.04,Mathematica 9和IntelliJIDEA 12.每当我从Mathematica复制一些文本并粘贴到IDEA中时,粘贴文本的末尾会有很多额外的字节。 在IDEA中最先出现的错误现在似乎是Java本身的错误。 我附加了一个显示行为的最小java示例。
因此,当我在Mathematica中键入Plot
时,select并复制它,然后运行示例我将得到以下输出,其中第一行是打印的表单,第二行是字节:
正如你所看到的, Plot
后面跟着一个0
字节,另外一些(不一定是零)字节。 在我所有的testing中,我发现一个有效的解决scheme是使用string,直到find第一个0
,但这并不能解决潜在的问题。 我真的希望看到这个问题,因为我经常在Mathematica和IntelliJIDEA之间复制代码,但是首先我需要知道该责备谁。
我怎么能找出Mathematica或Java是否在这里做错了什么? 我可以将Mathematica内容复制到不同的编辑器,浏览器等,我从来没有见过这样的东西。 另一方面,我从来没有发现IntelliJ(Java)复制垃圾。 什么是一个很好的方式来找出Mathematica是否使用剪贴板错误或Java有一个错误?
在Mathematica中select一些文本,按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复制操作之后,可以看看剪贴板中的内容吗?
当然。 不幸的是,它什么都不返回 当我从浏览器标记和复制下面的东西,例如“this here”,我得到
patrick@lenerd:~$ xclip -out | hexdump -C 00000000 74 68 69 73 20 68 65 72 65 |this here| 00000009
我尝试了以下的东西,我总是使用Mathematica复制的“Plot”string。 首先,我按照他的评论中的build议,尝试了大卫的大型testingclass 。 有了这两个,Oracle JRE和Ubuntu附带的OpenJRE,我得到了以下输出:
=========== Plot[00][7f][00][00] =========== Obtained transferrable of type sun.awt.datatransfer.ClipboardTransferable Plot[00][7f][00][00] ===========
我从上面的短小的狙击手给出了相同的结果(虽然不是在hex表示)。 然后,我尝试了xclip
的不同select ,并使用值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
重要的是要注意,当我不用xclip
使用verbose
输出时,我只能看到terminal中的“Plot”。 在上面,你会发现缓冲区中可能没有显示4个字节,因为它们以00
开始。 此外,额外的字节是00 00 00 00
,至less这是什么显示。 在java中我们有一个7f
(或127
)在第二个位置。
我想这一切都表明,这个错误来自Mathematica,因为它在缓冲区中复制了额外的东西,Java只是有点草率,因为它不会在第一个00
切割。
这些结论听起来不错。
如果找到以下有关X剪贴板行为的参考资料:
X11r6客户端间通信约定手册“ ,特别是” 通过选择方式进行对等通信“ ,以及开发者角落中更为详尽的解释(以及Python测试工具) :在Linux中复制粘贴
因此,数据“Plot [00] [7f] [00] [00]”或者“Plot [00] [00] [00] [00]”是Mathematica根据请求向应用程序提供的数据即“读取”剪贴板。 我只能想象,Mathematica说“这是八字节的字符串”,阅读应用程序试图解决这个问题,阅读实际字符数组的末尾。
这也可能是X中的一个bug(但是Ubuntu 12.04不会使用Mir,所以可能不会)。
请注意,在Java中,字符串不是NUL终止的,“Plot [00] [7f] [00] [00]”确实是一个有效的字符串。
快速浏览一下xclip
的源xclip
(用yumdownloader --source xclip
在我的Fedora上使用yumdownloader --source xclip
获得)似乎显示它只是调用XFetchBuffer或memcpy
(不完全确定)来获取字节,然后调用fwrite
,所以它会愉快地写输出的NUL。
这看起来像一些问题与字符串结束字符(我有类似的问题与数据修改的c + + DLL的,并通过外部系统发送)。 我不知道如何解决这个问题,但我认为你可以做一个简单的解决方法来删除无效的字符 – 简单的文本调用trim()方法。
text = (String) systemClipboard.getData(DataFlavor.stringFlavor); text = text.trim(); System.out.println(text);
我想,它是零终止的“C风格”的字符串,并有一些Matematica和Java之间的误解。 我会问在Linux论坛上的剪贴板应该如何工作。
作为解决方法,我建议
test.replaceFirst("\u0000(?s:.*)", "");