你面对的是一个的许多症状的什么,我认为每一个现代程序员存在的祸根: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答案,演示了这可以走多远。
一些轻读: