chefkoch/morphoji

Morphoji 是一个库,可以将 UTF-8 表情字符转换为 Latin1 占位符,反之亦然。

1.1.0 2017-03-22 11:40 UTC

This package is not auto-updated.

Last update: 2024-09-13 23:02:43 UTC


README

Build Status

Morphoji 是一个小巧的 PHP 库,可以将 Unicode 表情字符 🤗 转换为 Latin1 占位符🙀 并反向转换。 👍

使用场景

你为什么想要这样做?也许是因为同样的原因:你有一个大型的旧 MySQL 数据库,所有文本列都定义为 utf8。太好了,因为使用 utf8,你可以存储 Unicode 提供的所有内容,包括表情字符,对吗?

大错特错。

显然,MySQL 中的 utf8(以及一些其他应用程序)限制为 3 字节 Unicode 字符。不幸的是,大部分 表情字符 都位于 4 字节 Unicode 空间。

尝试在 MySQL utf8 表中存储这些表情(和其他 4 字节字符)会导致这些字符无声地丢失。

utf8mb4

当然,对于这个问题有一个系统性的解决方案。将相关列(以及与它们的数据库连接)从 utf8 转换为 utf8mb4。这个字符集实际上可以存储 Unicode 所指定的所有字符。

如果你想走这条路(这绝对是最干净的方法),Mathias Bynens 写了一篇 很好的文章

但是,如果你的数据库真的很大,有很多文本列,并且你不想只转换一些列到新的字符集,而是所有列(因为一致性,因为你还需要更改连接的字符集)并且你真的只关心表情符号,而不关心 古希腊音乐符号 等字符,并且你几年前已经为 utf8 做了所有的转换,真的没有时间和精力再做了...

...那么你就可以使用 Morphoji。

用法

Morphoji 可以通过 Composer 在你想要使用的项目中引入

composer require chefkoch/morphoji

转换

现在,如果你有一个包含(可能)表情字符的 $text,你可以这样处理

$text = '...'; // Some text with unicode emojis.


$converter = new \Chefkoch\Morphoji\Converter();

// From utf-8 text to db.
$textForDb = $converter->fromEmojis($text);
$db->insert($textForDb); // Dummy code for DB insert command.

// From db to utf-8 text.
$textWithEmoji = $converter->toEmojis($db->getTextWithPlaceholders());
return new Response($textWithEmoji); // Dummy code for HTML response to browser.

包装

此外,你可以将包含表情占位符的字符串转换为包装了任意前缀和后缀的字符串。

例如,你可以使用此方法用标签装饰占位符。

$placeholderText = 'Lorem :emoji-12345: ipsum';

$converter = new \Chefkoch\Morphoji\Converter();

$wrapped = $converter->wrap($placeholderText, ' ');

// results in $wrapped == 'Lorem <span class="emoji" data-emoji-code="12345">&nbsp;</span> ipsum'

这样,你可以在你的前端渲染文本时用你自己的图形替换它们。

工作原理

Morphoji 只会转换具有官方表情表示的字符。这是通过使用来自 官方 Unicode 图表 的正则表达式实现的。

匹配该正则表达式的每个字符都将转换为 Latin1 占位符

:emoji-[hex code]:

例如,一个替换的“面吹口哨”表情符号(1F618,😘)将表示为 :emoji-1f618:

使用相应的正则表达式将占位符转换回工作原理与上面基本相同。

为什么不直接转换为 HTML 实体然后再在输出中使用它们呢?

Morphoji 的目标是实现输出设备的无关性。如果你只想将所有内容输出为 HTML,那没问题,但在这种情况下,这可能不是你需要的库。

在我的情况下,数据库中存储的数据不一定是在 HTML 环境中输出的,因此能够将这些实体转换回原来的形式是强制性的。(而且在一个几乎所有输出设备和应用程序都能够处理全 UTF-8 的时间,这通常是一个更干净的方法。)

其他语言

没有计划在其他任何语言中实现这一点。编写表情符号检测的正则表达式大约是工作的二分之一,如果你想在你的实现中使用它:请继续。

测试

如果你想做出贡献,请别忘了添加/修改测试。

要运行它们

composer install
vendor/bin/phpunit

许可证

Morphoji 在 MIT 许可证下授权。