用 JavaScript 重新创建 Skype 报价

Recreating Skype quote with JavaScript

我正在尝试重新创建(或 "forge")与 JavaScript 的 Skype 报价。因此,我需要将 XML-String 推送到剪贴板,格式为 "SkypeMessageFragment"。警报显示效果很好,但使用 ClipView 调查剪贴板仅显示一个字符 (<),尽管 text/plain 内容是正确的。

原因可能是内容的类型,它应该是 MemoryStream(当然 JavaScript 不可能做到这一点),解释说 here

有没有人知道如何解决这个问题,或者当时不可能吗?

document.addEventListener('copy', function(e) {
          var msg = $('#msg').val();
          var name = $('#name').val();
          var date = $('#date').val();
          var time = moment(date, 'MM/DD/YYYY h:mm a').valueOf();
          var skype = '<quote author="'+name+'" timestamp="'+time+'">'+msg+'</quote>';
          var locale = 1033;
          e.clipboardData.setData('text/plain', msg);
          e.clipboardData.setData('SkypeMessageFragment', skype);
          console.log('Copy');
          alert(e.clipboardData.getData('SkypeMessageFragment'));
          e.preventDefault();
});

我假设您使用的是 Windows,因为(据我所知)Skype 引号不适用于其他操作系统。

首先,您的代码无法在 Chromium 中运行,因为它以名为 Chromium Web Custom MIME Data Format 的特殊类型序列化所有剪贴板数据,而 Skype 获取 SkypeMessageFragment 类型。


让我们来看看 Firefox 的行为。我已经使用 Free Clipboard Viewer 检查 Firefox 存储的数据,对于 text/plain 类型,一切正常。但这是我对 SkypeMessageFragment 类型的看法:

从第一个字节,我们可以推断出编码是 UCS-2 和 Little Endian,这是连贯的,因为 Java脚本引擎将字符串存储在 UCS- 2 内部格式。我们也可以看到最后一个字节是空字节。

这就是您只看到 < 的原因,因为下一个字节是空字节,因此您的软件可能认为该字符串已终止。

现在,如果我们对真实的 Skype 报价执行相同的操作,我们可以看到 Skype 使用的是 UTF-8,没有尾随空字节。所以它期望剪贴板中有一个 UTF-8 编码的字符串,这就是为什么你的引用没有按预期工作。


我们可以尝试使用那段代码强制使用 UTF-8 格式:

function usc2_to_utf8(usc2_string) {
    utf8_string = "";

    for (var i = 0; i < usc2_string.length; i += 2) {
        var codePoint = 0;

        codePoint += usc2_string.codePointAt(i + 1);
        codePoint <<= 8;
        codePoint += usc2_string.codePointAt(i);

        utf8_string += String.fromCharCode(codePoint);
    }

    return utf8_string;
}

该技巧将数据以 UTF-8 格式存储在剪贴板中:

但这还不够。引用出现在文本区域中,就好像它是由 Skype 制作的一样,但如果您 post Skype 将无法识别该引用。我想这与我未能删除的字符串末尾的 2 / 3 个空字节有关。

另外,请注意 Firefox might change how it handles custom clipboard types 很快。


您可能想使用 Flash,但 Flash 也会失败,因为 it will prefix all the custom types.

我不知道 Java 小程序等其他扩展如何与剪贴板一起使用,但我猜你不想强迫用户安装任何东西,所以恐怕没有解决方案。