hal*_*tan 9 java linux wolfram-mathematica copy-paste
我必须遵循以下设置: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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以在从Mathematica复制操作后查看剪贴板内容吗?
当然.不幸的是,它绝不会返回.例如,当我在浏览器中标记并复制以下内容时,就像"这里"一样
patrick@lenerd:~$ xclip -out | hexdump -C
00000000 74 68 69 73 20 68 65 72 65 |this here|
00000009
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的东西,我总是使用Mathematica中复制的"Plot"字符串.首先,我按照评论中的建议尝试了大卫的大型测试课程.有了这两个,Oracle JRE和Ubuntu附带的OpenJRE,我得到了以下输出:
===========
Plot[00][7f][00][00]
===========
Obtained transferrable of type sun.awt.datatransfer.ClipboardTransferable
Plot[00][7f][00][00]
===========
Run Code Online (Sandbox Code Playgroud)
从上面我的短狙击给出相同的结果(虽然不是十六进制表示).然后我尝试了不同的选择,从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
Run Code Online (Sandbox Code Playgroud)
需要注意的是,当我不使用verbose
输出时xclip
,我只在终端中看到"Plot".上面,你看到缓冲区中还有4个字节可能没有显示,因为它们以a开头00
.另外,字节的额外是00 00 00 00
,至少这是显示的内容.在java中,我们有一个7f
(或127
)在第二个位置.
我想这一切都表明这个错误来自Mathematica,因为它在缓冲区中复制了额外的东西,而Java只是有点草率,因为它不会在第一次切割00
.
这些结论看起来很合理。
\n\n如果找到以下有关 X 剪贴板行为的参考资料:
\n\nX11r6 Inter-Client Communication Conventions Manual,特别是Peer-to-Peer Communication by Means of Selections,以及 Developer\xe2\x80\x99s 角落的更压缩的解释(和 Python 测试工具):在 Linux 中复制粘贴
\n\n因此,数据“Plot[00][7f][00][00]”或者“Plot[00][00][00][00]”是 Mathematica 根据应用程序请求实际提供的数据“读取”剪贴板。我只能想象 Mathematica 说“这是带有八个字节的字符串”,并且读取应用程序尝试处理这个问题,读取实际字符数组的末尾。
\n\n这也可能是 X 中的一个错误(但 Ubuntu 12.04 尚未使用 Mir,所以可能不会。)
\n\n请注意,在 Java 中,字符串不是以 NUL 结尾的,并且“Plot[00][7f][00][00]”确实是一个有效的字符串。
\n\nxclip
快速浏览一下(在我的 Fedora 上获得的)源代码yumdownloader --source xclip
似乎表明它只是调用XFetchBuffer或memcpy
(不完全确定)来获取字节,然后调用fwrite
这些字节,因此它会很乐意将 NUL 写入输出。
归档时间: |
|
查看次数: |
308 次 |
最近记录: |