【问题标题】:How to remove the embedded formatting of an UTF-8 string?如何删除 UTF-8 字符串的嵌入格式?
【发布时间】:2021-11-27 09:22:42
【问题描述】:

我在 PHP 中查询 Facebook API 以获取帖子列表并将其显示在网站上。

// $facebook is an instance of Facebook\Facebook
$response = $facebook->get('posts?fields=id,message,created_time,full_picture,permalink_url,status_type&limit=20');
$graphEdge = $response->getGraphEdge();
$posts = [];

foreach ($graphEdge as $post) {
    $message = $post->getField('message');
}

调用返回的文本如下图所示:

我的问题是有时文本的格式似乎嵌入在字符本身中。例如,文本“Montélimar - aux Portes du Soleil”使用的字体与 CSS 中定义的字体不同,我不能强制它使用不同的样式。 HTML 如下所示:

<p>
  Profitez d’un cadre de vie idéal pour faire construire votre maison individuelle sur la commune de ????????????????????́???????????????????? - ???????????? ???????????????????????? ???????? ???????????????????????? ☀️
  Notre lotissement « ???????? ???????????????????????????? ???????? ????????́???????? » ...
</p>

我们甚至将数据存储在 JSON 对象中,它看起来像这样(参见“描述”字段):

[
    {
        "pageName": "---",
        "type": "---",
        "date": "---",
        "description": "Profitez d’un cadre de vie idéal pour faire construire votre maison individuelle sur la commune de ????????????????????́???????????????????? - ???????????? ???????????????????????? ???????? ???????????????????????? ☀️ Notre lotissement « ???????? ???????????????????????????? ???????? ????????́???????? » ...",
        "time": 0000,
        "thumbnail": "---",
        "url": "---",
        "img": "---"
    }
]

如您所见,某些文本具有默认样式,我不知道如何摆脱它。我尝试使用 mb_convert_encoding(); 通过 PHP 将文本重新编码为 UTF-8,但这并不能解决问题,因为字符串已经是 UTF-8。

如何删除这种格式?这是均匀的格式,还是只是特殊的 UTF-8 符号?

【问题讨论】:

    标签: php facebook-graph-api utf-8 facebook-php-sdk


    【解决方案1】:

    如果您复制其中一个字符(例如“Montélimar”的“M”)并尝试在 Unicode 字符表 (https://unicode-table.com/en/1D40C/) 中查找它,您会发现它不是字母而是一个“数学粗体大写 M”,由以下符号表示:

    • Unicode 号码:U+1D40C
    • HTML 代码:&amp;#119820;

    所以这是您的内容本身的问题,而不是编码问题。一切都很好,我认为您无法解决这个外观问题。

    【讨论】:

      【解决方案2】:

      如果 UTF-8 特殊字符妨碍您,您可以尝试使用 iconv 将字符串转换为 ASCII。但是,个别字符以及在某些情况下重要信息可能会丢失。

      $strUTF8mb4 = "Profitez d’un cadre de vie idéal pour faire construire votre maison individuelle sur la commune de ?????́????? - ??? ?????? ?? ?????? ☀️ Notre lotissement « ?? ??????? ?? ??́?? » ...";
      $strASCII = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $strUTF8mb4);
      //string(181) "Profitez d'un cadre de vie id'eal pour faire construire votre maison individuelle sur la commune de Montelimar - aux Portes du Soleil Notre lotissement << Le Domaine de Gery >> ..."
      

      尤其是法语,这段代码可能会产生更好的结果:

      $strIso = iconv("UTF-8", "ISO-8859-15//TRANSLIT//IGNORE", $strUTF8mb4);
      $strUtf8 = iconv("ISO-8859-15", "UTF-8", $strIso);
      //"Profitez d'un cadre de vie idéal pour faire construire votre maison individuelle sur la commune de Montelimar - aux Portes du Soleil Notre lotissement « Le Domaine de Gery » ..."
      

      【讨论】:

      • 这是一个不错的解决方案,但是,我认为丢失表情符号是不可接受的。不过我还是会记住的。
      • 如果您碰巧有一个想法来转换 UTF-8 字符同时保留表情符号,我会感兴趣的!
      • 为此,必须将字符串拆分为表情符号和其他 UTF8 字符。在字符串中查找表情符号是 PHP 类 emoji-detector-php 应该做的:github.com/aaronpk/emoji-detector-php.
      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2019-04-30
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2011-02-09
      • 2013-12-22
      • 1970-01-01
      相关资源
      最近更新 更多