【问题标题】:Convert \u emoji string to utf-8 for email body将 \u 表情符号字符串转换为电子邮件正文的 utf-8
【发布时间】:2019-04-12 17:54:20
【问题描述】:

我在 PHP 字符串变量中有以下表情符号

$emoji = "\u{1F9D1}\u{1F4AC}";
echo $emoji;

上面的代码将打印以下表情符号。

????????

我想将这些表情符号嵌入到电子邮件正文中。为此,我想将它们转换为 🧑💬 以便我可以将它们放在电子邮件正文中并且它们会正确显示。

我如何在 PHP 中做到这一点?

【问题讨论】:

    标签: php emoji


    【解决方案1】:
    $foo = preg_replace('#\\\u\{(.*?)\}#', '&#x$1;', $emoji);
    
    • \u 需要转义,因为它在正则表达式中具有特殊含义,并且由于反斜杠在 PHP 文本字面量中也具有特殊含义,所以我们这里需要三个。

    • { 和 } 也有特殊含义,因此需要用一个反斜杠进行转义。

    • (.*?) 匹配所有内容(除了换行符),?让它变得不贪心。

    • 我添加了一个 ;在替换的最后 - 浏览器在丢失时是容错的,但在技术上是 HTML 语法要求的。


    以及“其他方向”,根据要求:

    $emojihtml = '🧑💬';
    
    $bar = preg_replace('~&#x(.*?);~', '\u{$1}', $emojihtml);
    

    (我在这里使用~ 作为正则表达式分隔符,因为# 是我们想要匹配的一部分,节省了转义。)

    【讨论】:

    • 完美!您能分享一下如何将其转换回来吗?
    • 我不会使用 $ 作为分隔符,因为它可能会导致与用作字符串结尾的 $ 混淆。我会选择~/。它确实有效,所以它不是一个错误,而是一个令人困惑的事情:)
    • @ManuelMannhardt 好点,把它改成~。 ($ 对于一些喜欢使用" 作为文本文字分隔符的人来说也可能有问题。不一定在这里,但是 PHP 将其作为更复杂表达式中变量开头的情况也很容易发生.)
    • 感谢更新的答案。我想知道为什么if ($emoji == $bar) 总是为上述返回false。
    • $bar 包含 text \u{1F9D1}\u{1F4AC} 在这些替换之后,但 $emoji 确实包含 ?? - 这就是 data 之间的区别和代码
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多