【问题标题】:How does "cut and paste" affect character encoding and what can go wrong?“剪切和粘贴”如何影响字符编码以及会出现什么问题?
【发布时间】:2009-12-18 18:05:15
【问题描述】:

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

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

【问题讨论】:

  • 这是在 Windows、Unix、ToasterOS 上吗?
  • Word 是一个 Windows 应用程序,谷歌搜索“TextPad”会出现“TextPad - Windows 的文本编辑器”,所以我猜他的意思是 Windows。
  • 我们同时拥有 Unix 平台和 Windows,因此两者的任何根本区别都会很有用。我自己的机器是 Windows,所以我对 Windows 的回答很满意。

标签: character-encoding cut-and-paste


【解决方案1】:

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

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

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

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

【讨论】:

  • +1 所以一个好的剪贴板会尝试将字符的一个版本标准化为 UTF-16/Unicode。
  • 我不确定你的意思。剪贴板不任何事情,除了保存应用程序放在那里的一些字节。剪贴板的作用类似于键值存储,其中键类似于 mimetype,值是 blob(然后您根据类型对其进行解释)。
  • @peter.murray.rust 这有点特定于 Windows。但我不是专家。
  • 实际上,在 Windows 上,CF_TEXT、CF_OEMTEXT 和 CF_UNICODETEXT 始终存在。将一个添加到剪贴板,并在剪贴板中添加转换并添加其他。所以剪贴板一些事情。
  • 在 OSX 上,pbcopy 和 pbpaste 使用 locale 环境变量来确定编码,例如LANG=en_US.UTF-8 将导致 pbcopy 和 pbpaste 使用 UTF-8。如果不存在,则默认为 C。
【解决方案2】:

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

【讨论】:

  • 嗨@Kaspar Etter,有没有办法防止这种情况?我正在经历一些与您描述的类似的事情,这让我发疯。从 Safari 复制并粘贴回 Mac 上的 Safari 也会扭曲字符串。键入 Safari 并点击“提交”按钮也会在 Mac 上的 Safari 中扭曲答案。不过,这个复制和粘贴问题对 iOS 上的 Safari 来说不是问题。
  • 只是为了澄清一下,在 Mac 上的 Safari 中,在“检查元素”上,复制 @Kaspar Etter 回复中的字符串 'mañana' === 'mañana',并将其粘贴到 Safari 的控制台。它将显示为“true”。
  • 我不知道。我什至不清楚哪种行为更可取。困扰我的是制造商缺乏文档以及供应商之间缺乏一致性。就 Safari 而言,规范化仅在粘贴字符串时发生。从 Safari 复制并将其粘贴到 Chrome 的控制台会导致我的 Mac 无法正常化。
  • 不管怎样,在 Safari 中打开 <html><body><script>document.write('mañana' === 'mañana')</script></body></html> 输出 false
  • 嗨@Kaspar,没错。它只发生在粘贴上。但是标准化也至少发生在 instructure.com 的 Canvas 上。在经典测验中,当学生在测验中输入希伯来语单词并点击“提交”时,输入已标准化,但答案键未标准化。在新测验中,输入和答案键都被标准化。这对我来说是个谜。火狐很有趣。即使我使用 AppleScript、JXA 或 Python 或直接从 Firefox 中复制的字符串读取,它仍然是规范化的。但是在Firefox本身中输入和提交或复制和粘贴,它不会正常化...
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    在使用@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 覆盖)。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2012-03-22
      • 1970-01-01
      • 2021-06-24
      • 2012-02-26
      • 2023-03-26
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多