从文档中复制/粘贴(PDF,docx) - 变音符号的奇怪行为


1

当我使用捷克语字符从PDF(预览)或Docx(页面)复制文本时,一些捷克字符会被复制,其重音“卡住”。

为了使这更奇怪,这种行为非常不一致:有时“ř”被复制得很好,有时则不是。此外,它似乎没有连接到特定的字体。但我认为这种情况更常发生在字体上,这些字体不是OSX原生的(例如Cambria,恰好是MS Office的默认设置)。

WordPress WYSYWIG textarea的屏幕截图

“í”的CMD + C结果:“í”

为什么会这样?

编辑

  • OSX:10.13.6(虽然它发生在我的旧操作系统甚至其他机器上)
  • 应用程序,我复制了以下文本:预览(PDF),页面(doc,docx)
  • 应用程序,我将文本粘贴到:任何东西(从Sublime文本到StackExchange中的文本编辑器,见上文)

此外,我注意到这通常发生在单词的末尾(可能是行的末尾)。一旦它再次发生,我将证实这一点,因为这种行为令人沮丧地难以重现。


你能澄清一下你的流程是什么吗?用Pages打开.docx文件,然后导出为pdf,然后复制/粘贴?哪里?
Tom Gewecke

用Pages打开一个.docx文件(例如,这也发生在其他工具上),复制文本,将其粘贴到任何地方(无论是Sublime文本,WordPress TinyMCE编辑器还是其他任何东西)。
Petr Cibulka

此行为有时会发生在doc / docx中(如上所述),有时以pdf(例如在Preview中打开)发生。我遗憾地没有安装MS Word,所以我无法测试那里的文本。
Petr Cibulka

@TomGewecke,我已经用这些细节编辑了我的问题。谢谢!
Petr Cibulka

使用Adobe Reader而不是预览会有所作为吗?这是pdf的黄金标准。
Tom Gewecke

Answers:


1

你面对的是一个许多症状的什么,我认为每一个现代程序员存在的祸根:Unicode规范化和交换字符编码。

人们可以在这个混乱的历史上写一本1000页的书(如果有人已经我不会感到惊讶),所以我会把它归结为你在这里所遇到的基础知识(而且我'我会过分简化一下),但接下来我会给你一些“进一步阅读”的链接。

首先,让我们确保您的菜单栏中有输入菜单:在“系统偏好设置”中,打开“键盘首选项”窗格并勾选“输入源”下的框。然后从该菜单项打开现在称为“显示表情符号和符号”的内容。在窗口的左上角,选择“自定义列表”,转到“代码表”并选中“Unicode”和“ISO-8859-1”。我们将做一个简短的讲座然后演示。

同样,这里有两个相互关联但分开的问题:

1.字符编码

我认为这是这个特定问题的根本原因。问题是微软多年来一直因为不能很好地处理Unicode而臭名昭着,因为它的平台或多或少地坚持使用旧的多语言字符集实现,这些字符集被称为“宽字符”,UCS-2或UTF-16。这个系统是在几年前实现的,当时人们认为16位(代表~65,000个字符)足以编码我们需要的每个符号。今天,有1,114,112个标准化的Unicode符号。

所以今天,大多数系统(以及Apple的所有系统)都使用称为UTF-8的编码,这是一种可变宽度的字符编码,其中没有设定的位数来编码任何给定的字符。这允许它向后兼容ASCII,并且还可以容纳添加新的符号和字符。

因此,当复制文本进出使用不同字符集(如Microsoft)的程序时,字符集需要完全重新编码和转换,这是一个传统上称为的过程iconv,尽管有几十个实现如何已经完成了。

2. Unicode组合字符

使编码问题更加复杂的是,多年来Unicode标准已经发展,并且意识到为了将独特字符的数量限制为“仅”数百万而不是数十亿,最好是有一些字符是“组合字符”,以常规方式修改前一个字符的字符。通过这样做,每个重音变体的每个字母都不需要单独的条目,只需在原始字符中添加“共享”重音字符即可。但并不总是这样做,所以有多种方法可以产生相同的符号。你的是一个完美的例子。


我们从符号LATIN SMALL LETTER I(U + 0069)开始:

i

现在,当您想要添加锐音时,Microsoft 会将其替换

带有急性的拉丁文小写字母(U + 00ED):

í

但苹果却增加了第二个角色,COMBINING ACUTE ACCENT(U + 0301):

́

你可以自己做(这里是角色查看器的来源)。只需键入一个i,然后combining acute在字符查看器中搜索,双击该符号,然后:

事实上 ,这与上面的第一个符号完全不同它是LATIN SMALL LETTER I(U + 0069),然后是 COMBINING ACUTE ACCENT(U + 0301)。将每个复制并粘贴到角色查看器中,您将看到我的意思。

是的,两者在视觉上代表相同的符号。但是,如果沿着某条线(通常与字符集转换大致相同),UTF-8进程会添加组合字符,但保留原始预组合字符?也就是说,当“组合符号”方法以某种方式添加到旧版本而不是替换它时会发生什么?那么,“结合角色”的口音仍然需要完成它的工作。

所以,当一个人将 LATIN SMALL LETTER I和 ACUTE(U + 00ED)与COMBINING ACUTE ACCENT(U + 0301)组合在一起时:

í́

你有它。

有一个非常着名的Stack Overflow答案,演示了这可以走多远。


一些轻读:


杰夫,我喜欢你对我们如何处理í́局面的阐述。:)感谢和抱歉没有能够奖励你的赏金(因为你绝对值得),我没有抓住它的时间限制...
Petr Cibulka

1

关于来自pdf的复制/粘贴,非ascii字符的处理可能会受到特定pdf创建过程的影响。如果没有关于如何生成pdf文件的信息,例如编码和使用的字体,则很难确定结果不正确的原因。


是的,我知道当它发生如此随机时很难确定问题。我希望有人会有类似的经历,可以对那里的情况有所了解。
Petr Cibulka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.