gpt4 book ai didi

angularjs - 表情符号和其他 unicode 字符在 Angular 中未正确显示

转载 作者:行者123 更新时间:2023-12-04 23:01:29 40 4
gpt4 key购买 nike

例如,我有一个使用来自 Twitter 的消息的网络应用程序。
JSON 的提要用于构建消息列表,但诸如🙏👍👊 之类的字符显示为菱形中的问号。该元素如下所示:

<div class="inner-message" ng-bind-html="unit.caption_text | linky:'_blank'"></div>           
当我在 Firefox 和 Chrome 中查看 JSON url 时,这些显示正常。
头部 sample :
<!DOCTYPE html>
<html class="wf-opensans-n4-active wf-active" lang="en">
<head>
<meta charset="utf-8">
我在调试时发现的一件事:当消息都在一个对象数组中,但不是 $scope 的一部分时,我可以将它们添加到页面并且表情符号正确显示。
所以我认为 Angular 会发生一些事情来做到这一点。我试过将 ng-bind-html 更改为 ng-bind,但这并没有做到。我试过删除 ng-bind-html 并在元素内使用 {{unit.caption_text}} ,但它仍然破坏了 unicode 字符。
目前,我需要能够使用链接过滤器来正确显示链接,因此 ng-bind-html 是必要的,但我认为这不是问题所在。
他们在 javascript 中发生了什么事情来破坏编码吗?
有没有办法让它们正确显示?

更新
这会根据需要显示图标,但“linky”不会为链接添加格式。
<div class="inner-message">{{unit.text}}</div>
enter image description here
这显示损坏的字符
<div class="inner-message" ng-bind-html="unit.text | linky:'_blank'"></div>
enter image description here

更新 2
最后到了那里,按照迈克尔链接的拉取请求中的详细说明进行更改,以防止 Angular 色困惑。
我还发现,如果我将 Symbola 添加到这些消息的字体堆栈中,它有助于提供一致性。您可以从 this page by George Douros 下载 Symbola .我通过 .ttf 到 .woff 转换器运行它以获得更好的浏览器支持,提供两种选择。

最佳答案

Note: This post does not display as intended on Chrome, as it doesn't support Emoji characters



它看起来像 Angular 的 $sanitize服务尝试将字符转换为它们的 HTML 实体等价物。但是,对于某些单个表情符号字符,它会将其拆分为 2。如 http://plnkr.co/edit/fDDen3bnnrQUvx3JfKgw?p=preview 所示。 ,
$scope.sanitizedText = $sanitize('🙈');

模板中的输出为
{{sanitizedText}}

显示 &#55357;&#56904; .为什么?我不知道。

这意味着任何使用 $sanitize将有效地打破这些字符。这包括
  • 使用 ng-bind-html 显示的输出没有经过的$sce.trustAsHtml
  • 任何东西都通过了 linky ,如在 linky source 中所见,它调用 $sanitize .

  • 所以,你可以避免 HTML 通过 $sanitize只要
  • 您通过 $sce.trustAsHtml 传递字符串
  • 您不会通过 Angular 提供的链接过滤器传递它,而是滚动您自己的过滤器 $sanitize输入。

  • 示例过滤器如下:
    app.filter('unsafeLinky', function($sce) {
    // Regex from https://github.com/angular/angular.js/blob/master/src/ngSanitize/filter/linky.js#L5
    var urlRegex = /(((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>])/gi;
    return function(input, target) {
    var targetHTML = target ? ' target="' + target + '"' : '';
    return $sce.trustAsHtml(input.replace(urlRegex,'<a href="$1"' + targetHTML + '>$1</a>'));
    }
    });

    哪个可以用作
    <p ng-bind-html="text | unsafeLinky:'_blank'"></p>

    你可以在 http://plnkr.co/edit/sRJmt4YVO8udJInCd4Cy?p=preview 看到这个演示。

    顾名思义,这个 unsafeLinky 过滤器是不安全的。一定要相信原文的出处。

    正如本答案开头所建议的, Chrome doesn't display Emoji characters properly .要在 Chrome 中显示字符,您可能必须使用某种图像替换。无论如何,我怀疑这超出了这个特定问题的范围。

    更新

    Angular 的 PR 可能会解决这个问题,一旦它被合并,就不需要上述解决方法: https://github.com/angular/angular.js/pull/6911

    关于angularjs - 表情符号和其他 unicode 字符在 Angular 中未正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994026/

    40 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com