23

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

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

4

4 回答 4

21

首先,文本编辑器的内部文本表示与保存文件时文本的编码(序列化)方式无关。因此,文档不是“在”编码中;它是一系列抽象字符。当文档保存到文件(或通过网络传输)时,它会被编码。

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

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

有一个名为“ClipSpy”的应用程序可以帮助您以交互方式查看我在说什么。

于 2009-12-18T18:18:12.397 回答
2

在研究Unicode 规范化时,我观察到以下行为:在 macOS 10.15.7 的 Firefox 中复制规范分解字符串 (NFD) 时,将字符串粘贴到 Chrome 中时将其规范化为 NFC。奇怪的是,粘贴会影响剪贴板的内容:当再次在 Firefox 中粘贴字符串时,它也会在那里进行规范组合。如果我在再次将其粘贴到 Firefox 之前未将其粘贴到其他任何位置,则 NFD 表单将继续存在。有趣的是,这个问题并没有出现在另一个方向:在 Chrome 中复制规范分解的字符串时,它会以 NFD 形式粘贴在我能告诉的任何地方。我的结论是 Firefox 以不同于其他应用程序的方式将文本存储到剪贴板。自己解决这个问题的一种方法是复制'mañana' === 'mañana'到您的 JavaScript 控制台。如果右侧字符串的 NFD 形式在复制和粘贴中幸存下来,则该语句返回 false。

于 2020-12-20T09:38:55.067 回答
1

这个问题问得好。当您复制/粘贴时,复制/粘贴的究竟是什么 - 字符或字节?如果是字节,它们是什么编码?

从答案中,听起来答案是“视情况而定”。不同的程序会将不同的东西放在剪贴板中,有时会放置多个表示形式。

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

于 2020-01-16T19:45:57.400 回答
0

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

复制并粘贴到:

Firefox:
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:没有规范化 Chrome的
其他应用程序:没有规范化(Firefox 覆盖)
Chrome 到其他应用程序:没有规范化(Safari 覆盖)

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

于 2021-03-05T16:13:34.393 回答