用 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 小程序等其他扩展如何与剪贴板一起使用,但我猜你不想强迫用户安装任何东西,所以恐怕没有解决方案。
我正在尝试重新创建(或 "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 小程序等其他扩展如何与剪贴板一起使用,但我猜你不想强迫用户安装任何东西,所以恐怕没有解决方案。