我必须遵循以下设置:Ubuntu 12.04,Mathematica 9和IntelliJIDEA 12.每次我从Mathematica复制一些文本并将其粘贴到IDEA中时,粘贴文本的末尾会有很多额外的字节。首先appeared to be a bug in IDEA现在看起来更像是java本身的一个错误。我附加了一个显示行为的最小java示例。
因此,当我在Mathematica中键入Plot
时,选择并复制它,然后运行示例我得到以下输出,其中第一行是打印形式,第二行是字节:
正如您所看到的,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
切割
答案 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
获得)似乎表明它只是调用XFetchBuffer或memcpy
(不完全确定)获取字节,然后在那些上调用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:.*)", "");