在我们的网站中,一些Mac用户在将TextArea文件中的文本复制到TinyMCE(由TinyMCE处理)时会遇到麻烦。所有重音字符都已损坏,例如,e?用于é,i?用于î,等等。我无法在Windows计算机上重现此问题。
当我在一个文件上写入TextArea的内容时(在将它插入数据库之前),我刚刚发现最初的é在视觉上与传统的é不同(在Vim上,见下文)。

的确:
// the corrupted é - first line of the screenshot
echo bin2hex($char); // display 65cc81
// traditionnal é
echo bin2hex('é'); // display c3a9在大量搜索之后,我来到这里:看来Mac OS将Unicode重音字符复制为两个字符的组合:在我们的示例中,e + ́.到目前为止,我还没有找到用真正的é替换损坏的e?的解决方案,以避免数据库中的e?。
我有点绝望。
发布于 2012-11-27 14:17:42
将表示规范化为一种或另一种形式的过程叫做,嗯,规范化。在PHP中有这样的班级,通过它发送所有输入是一个好主意:
$input = Normalizer::normalize($input);您可能想要规范化为C,规范分解,然后是正则组合。
如果这个类在您的系统上不可用,就会有拼贴UTF-8库。
发布于 2012-11-27 14:42:50
这仅仅是@deceze已经回答的问题之外的另外一个问题。Unicode中有多种方法来指定相同的字符(在等价意义上)。
这里有一个常见的例子:
65cc81这是Utf-8编码中的两个Unicode编码点。65是e拉丁文小写字母E (U+0065),cc81是́,结合了尖锐口音(U+0301) (它不能由浏览器单独显示,所以我采用了HTML实体)。
在Unicode中,这被称为组合序列。但是,由于某些原因,您的数据库不支持它。可能是因为列的编码不是UTF-8,或者数据库连接有问题。
它规范地等价于
c3a9这是Utf-8编码中的单个Unicode编码点。c3a9是带有é (U+00E9)的拉丁字母E。看起来您的数据库没有问题要处理,可能是因为数据库连接成功地将其重新编码为拉丁语1/ISO8859-1。
所以想到了两种处理数据的方法。这要么是数据重新编码中的问题,要么是存储数据的问题。
只要您对组合unicode码点序列的去组合感兴趣,就应该使用德凯兹的回答中概述的规范化器。
您还可以允许将UTF-8存储到数据库中,这样您就不会有问题了。
此外,无论如何,您可能应该正常化,以便更好地对数据库或程序中的数据进行排序和比较。正如您所看到的,二进制序列不同,这可能会给二进制级别上的所有比较带来问题。
当然,您可以节省一些流量:)
发布于 2012-11-27 14:33:44
有一个tinymce配置参数,它允许在插入编辑器之前定义一个函数来处理粘贴的内容:预处理
使用该函数,您可以用所需的形式替换专用字符。
tinyMCE.init({
...
paste_preprocess : function(pl, o) {
// Content string containing the HTML from the clipboard
o.content = o.content.replace(/\u2020/, 'x'); // example
},
paste_postprocess : function(pl, o) {
...
},
...
});https://stackoverflow.com/questions/13586060
复制相似问题