首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP: Unicode重音字符和diacritics

PHP: Unicode重音字符和diacritics
EN

Stack Overflow用户
提问于 2012-11-27 14:10:58
回答 3查看 1.2K关注 0票数 9

在我们的网站中,一些Mac用户在将TextArea文件中的文本复制到TinyMCE(由TinyMCE处理)时会遇到麻烦。所有重音字符都已损坏,例如,e?用于éi?用于î,等等。我无法在Windows计算机上重现此问题。

当我在一个文件上写入TextArea的内容时(在将它插入数据库之前),我刚刚发现最初的在视觉上与传统的é不同(在Vim上,见下文)。

的确:

代码语言:javascript
复制
// the corrupted é - first line of the screenshot
echo bin2hex($char); // display 65cc81

// traditionnal é
echo bin2hex('é');   // display c3a9

在大量搜索之后,我来到这里:看来Mac OS将Unicode重音字符复制为两个字符的组合:在我们的示例中,e + ́.到目前为止,我还没有找到用真正的é替换损坏的e?的解决方案,以避免数据库中的e?

我有点绝望。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-27 14:17:42

将表示规范化为一种或另一种形式的过程叫做,嗯,规范化。在PHP中有这样的班级,通过它发送所有输入是一个好主意:

代码语言:javascript
复制
$input = Normalizer::normalize($input);

您可能想要规范化为C,规范分解,然后是正则组合。

如果这个类在您的系统上不可用,就会有拼贴UTF-8库

票数 8
EN

Stack Overflow用户

发布于 2012-11-27 14:42:50

这仅仅是@deceze已经回答的问题之外的另外一个问题。Unicode中有多种方法来指定相同的字符(在等价意义上)。

这里有一个常见的例子:

代码语言:javascript
复制
65cc81

这是Utf-8编码中的两个Unicode编码点。65e拉丁文小写字母E (U+0065),cc81́,结合了尖锐口音(U+0301) (它不能由浏览器单独显示,所以我采用了HTML实体)。

在Unicode中,这被称为组合序列。但是,由于某些原因,您的数据库不支持它。可能是因为列的编码不是UTF-8,或者数据库连接有问题。

它规范地等价于

代码语言:javascript
复制
c3a9

这是Utf-8编码中的单个Unicode编码点。c3a9是带有é (U+00E9)的拉丁字母E。看起来您的数据库没有问题要处理,可能是因为数据库连接成功地将其重新编码为拉丁语1/ISO8859-1。

所以想到了两种处理数据的方法。这要么是数据重新编码中的问题,要么是存储数据的问题。

只要您对组合unicode码点序列的去组合感兴趣,就应该使用德凯兹的回答中概述的规范化器。

您还可以允许将UTF-8存储到数据库中,这样您就不会有问题了。

此外,无论如何,您可能应该正常化,以便更好地对数据库或程序中的数据进行排序和比较。正如您所看到的,二进制序列不同,这可能会给二进制级别上的所有比较带来问题。

当然,您可以节省一些流量:)

票数 4
EN

Stack Overflow用户

发布于 2012-11-27 14:33:44

有一个tinymce配置参数,它允许在插入编辑器之前定义一个函数来处理粘贴的内容:预处理

使用该函数,您可以用所需的形式替换专用字符。

代码语言:javascript
复制
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) {
            ...
        },
        ...
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13586060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档