Character encoding “怎么做?”;剪贴;影响字符编码,会出现什么问题?

Character encoding “怎么做?”;剪贴;影响字符编码,会出现什么问题?,character-encoding,cut-and-paste,Character Encoding,Cut And Paste,我在工具a中显示了编码a的文档a,在工具B中显示了编码B的文档B。如果我将(部分)B剪切并粘贴到a中,结果字符编码可能是什么?我意识到这取决于工具A和工具B以及粘贴缓冲区中保存的信息(可能包含编码?)和操作系统 高质量的工具应该做什么?在实践中,有多少常用工具(例如Word、TextPad、各种IDE等)做得很好?首先,文本编辑器对文本的内部表示与保存文件时文本的编码(序列化)方式无关。因此,文档不是“处于”编码中;这是一系列抽象的字符。当文档保存到文件(或通过网络传输)时,它就会被编码 这取决

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


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

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

这取决于每个应用程序决定将什么放在剪贴板上。通常,一个知道自己在做什么的windows应用程序会在剪贴板上放置许多不同的表示形式。当你粘贴到另一个应用程序中时,该应用程序将寻找最适合其需要的表示

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


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

这是一个非常好的问题。复制/粘贴时,复制/粘贴的内容究竟是字符还是字节?。如果是字节,它们是什么编码

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


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

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

在使用@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的画布上发生。在经典测验的填空问题中,当学生在测验中键入希伯来语单词并点击“提交”时,输入是正常的,但答案键不是。然而,在新的测验中,输入和答案键都是标准化的。这对我来说是个谜

铬:
Chrome到Chrome:无规范化
Chrome的其他应用:无规范化(Firefox覆盖)
Chrome与其他应用程序:无规范化(Safari覆盖)


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

这是在Windows、Unix和ToasterOS上吗?Word是Windows应用程序,谷歌搜索“TextPad”会出现“TextPad-Windows文本编辑器”,所以我猜他指的是Windows。我们有Unix平台和Windows,所以两者之间的任何根本区别都是有用的。我自己的机器是Windows,所以我很高兴有一个Windows答案。+1所以一个好的剪贴板会尝试将一个版本的字符标准化为UTF-16/Unicode。我不确定你的意思。剪贴板除了保留应用程序放在那里的一些字节外,什么都不做。剪贴板的作用类似于键值存储,其中键值类似于mimetype,而值是blob(然后根据类型进行解释)。@peter.murray.rust这有点特定于Windows。但我不是专家。事实上,在Windows上,CF_文本、CF_OEMTEXT和CF_Unicode文本总是存在。将其中一个添加到剪贴板,然后使用“转换并添加其他内容”将剪贴板添加到剪贴板。在OSX上,pbcopy和pbpaste使用区域设置环境变量来确定编码,例如
LANG=en_US。UTF-8
将导致pbcopy和pbpaste使用UTF-8。如果不存在,默认为C.Hi@Kaspar Etter,有没有办法防止这种情况?我正在经历一些和你描述的相似的事情,这让我发疯。从Safari复制并粘贴回Mac上的Safari也会扭曲字符串。Typin