“剪切和粘贴”如何影响字符编码以及可能出现的问题?

时间:2009-12-18 18:05:15

标签: character-encoding cut-and-paste

我在工具A中显示了编码A中的文档A,在工具B中显示了编码B中的文档B.如果我将(部分)B剪切并粘贴到A中可能是什么结果字符编码?我意识到这取决于工具A和工具B以及粘贴缓冲区中保存的信息(可能包含编码?)和操作系统。

高质量的工具应该做什么?在实践中有多少常用工具(例如Word,TextPad,各种IDE等)做得很好?

4 个答案:

答案 0 :(得分:19)

首先,文本编辑器的文本内部表示与保存文件时文本的编码(序列化)无关。所以文档不是“编码”;这是一系列抽象人物。当文档保存到文件(或通过网络传输)然后它被编码。

由每个应用程序决定它放在剪贴板上的内容。通常,知道它正在做什么的Windows应用程序会在剪贴板上放置许多不同的表示。粘贴到其他应用程序时,应用程序将查找最适合其需要的表示。

在您的情况下,文本编辑器(知道它在做什么)将把选定字符串的Unicode表示放到剪贴板上(其中,在Windows中,Unicode通常以UTF-16的形式移动,但这并不重要) 。当您粘贴到另一个应用程序时,它会将该Unicode字符序列插入到选择点的文档中。

有一个名为“ClipSpy”的应用程序可以帮助您以交互方式查看我正在谈论的内容。

答案 1 :(得分:2)

我在查看 Unicode normalization 时观察到以下行为:在 macOS 10.15.7 中的 Firefox 中复制规范分解字符串 (NFD) 时,该字符串在将其粘贴到 Chrome 时被标准化为 NFC。奇怪的是粘贴会影响剪贴板的内容:再次在 Firefox 中粘贴字符串时,它也会在那里规范地组合。如果我在再次将其粘贴到 Firefox 之前不将其粘贴到其他任何地方,则 NFD 形式仍然存在。有趣的是,问题不会发生在另一个方向:在 Chrome 中复制规范分解的字符串时,它以 NFD 形式粘贴到我能分辨的任何地方。我的结论是 Firefox 将文本存储到剪贴板的方式与其他应用程序不同。自己解决这个问题的一种方法是将 'mañana' === 'mañana' 复制到您的 JavaScript 控制台。如果右侧字符串的 NFD 形式在复制和粘贴后仍然存在,则该语句返回 false。

答案 2 :(得分:0)

这是一个很好的问题。复制/粘贴时,复制/粘贴的内容恰好是-CHARACTERS或BYTES?如果是BYTES,它们的编码是什么?

从答案看来,答案似乎是“取决于”。不同的程序会在剪贴板中放置不同的内容,有时会放置多个表示形式。

然后,粘贴程序需要选择最好的粘贴程序,并用它“做正确的事”。

答案 3 :(得分:0)

在使用@Kaspar Etter 进行转换后,我进行了一些测试。这是我发现的:

复制自并粘贴到:

火狐:
Firefox 到 Firefox:没有标准化
Firefox 的其他应用程序:没有规范化
Firefox 到其他应用程序:规范化

即使我们使用 AppleScript、JXA 或 Python 直接读取包含从 Firefox 复制的文本的 SystemClipboard,文本仍然是规范化的。由于从 Firefox 复制粘贴到 Firefox 不涉及规范化,因此 Firefox 在复制过程中可能不会对文本进行规范化。我不知道规范化何时发生。

Safari(MacOS,不是 iOS):
Safari 到 Safari:规范化
Safari 的其他应用:规范化
Safari 到其他应用:没有标准化

对于 Safari (MacOS),规范化也发生在 instructure.com 的 Canvas 上。在经典测验的填空题中,当学生在测验中输入希伯来语单词并点击“提交”时,输入被规范化,但答案键不是。然而,在新测验中,输入和答案键都被标准化了。这对我来说是个谜。

铬:
Chrome 到 Chrome:没有标准化
Chrome 的其他应用程序:没有规范化(Firefox 覆盖)
Chrome 到其他应用:没有标准化(Safari 覆盖)

结论:Firefox 和 Safari 的行为方式相反。 Chrome 的行为正常且一致(除非它被 Firefox 和 Safari 覆盖)。