jjzjj

javascript - 渲染或删除表情符号

coder 2024-07-26 原文

我正在从 Twitter 中提取推文并想在网页上显示它们,但我看到的不是表情符号,而是 ? 和 ? 等字符的框。我怎样才能像 Twitter 那样将它们显示为图像,或者如果这不可能,则将它们全部删除?

我试过:

item["text"] = item["text"].replace('?', ""); 

但是它抛出 js 错误。

最佳答案

拜托,拜托,永远不要盲目地删除大块文本,尤其是不要仅仅因为您看不到或理解它们;它破坏了信息。有人出于某种原因将它们放在那里;如果没有表情符号,包含表情符号的推文通常没有任何意义。

就其值(value)而言,您所看到的并不是真正的“二元”;它很可能是一个用十六进制拼写的 Unicode 代码点的小方 block 。对于?,那是 U+1F49C,所以你可能会看到 0 1 F 4 9 C .当您安装的字体都没有字形时,这就是 Unicode 字符的呈现方式。

要真正看到字符,您有多种选择。

  1. here 获取 Symbola , 并安装它。现在你可以看到表情符号了。但没有其他人可以。
  2. 获取 Symbola,并使用 @font-face 将其添加到您的网站像这样阻止:

    @font-face {
        font-family: Symbola;
        src: url('Symbola.ttf') format('truetype');
        unicode-range: U+1F???;
    }
    

    然后用font-family: Symbola, "your preferred font", sans-serif;设置你的页面字体.

    这样做的缺点是,据我所知,CSS 的 font-family选择第一个存在的字体,指定 Unicode 后备。所以在不支持 unicode-range 的浏览器中( Firefox ),这将在不是特别漂亮的 Symbola 中呈现您的整个页面

    你可以通过找到所有表情符号并将它们包装在 <span class="emoji"> 中来解决这个问题。 , 然后只对 .emoji 使用 Symbola元素。

  3. 找到所有表情符号并将它们替换为 <img>标签,就像 Twitter 那样。 Twitter 的图像都在包含代码点的 URL 中,例如https://abs.twimg.com/emoji/v1/72x72/1f43e.png ,因此只需重用它们就足够了。 (我有点惊讶 Twitter API 实际上不会为你做这件事。)

如果您想查找并替换所有表情符号,您可能只想查找所有星体层字符,即那些不在现代人类语言所在的基本多语言层中的字符。这些都是代码点为 U+10000 及以上的字符。

在 JavaScript 中,字符串并不是真正的字符串;它们是 16 位数字的数组。 16 位是四个十六进制数字,因此具有五个十六进制数字的 Unicode 代码点不适合单个 16 位数字。相反,JavaScript 使用可怕的 UTF-16 编码对它们进行编码,它使用两个 16 位数字:一个在 0xD800 到 0xDBFF 范围内,一个在 0xDC00 到 0xDFFF 范围内。两个数字一起称为“代理对”。这些数字都不是真正的 Unicode 代码点;整个 block 都保留用于此编码。

要找到所有的星界字符,你实际上是想找到所有的代理对:

/[\uD800-\uDBFF][\uDC00-\uDFFF]/

因此,Twitter 图像替换的实现可能如下所示:

var text = "hey babe  ?  how you doin";

// Split on surrogate pairs, and preserve the surrogates; this will give
// you an array that alternates between BMP text and a single surrogate
// pair: [text, emoji, text, emoji, text...]
var chunks = text.split(/([\uD800-\uDBFF][\uDC00-\uDFFF])/);

// A DocumentFragment is a DOM tree that can be manipulated freely without
// causing a reflow, so it's more performant for heavy tree-building and a
// good habit to get into
var frag = document.createDocumentFragment();

for (var i = 0, l = chunks.length; i < l; i++) {
    if (i % 2 == 0) {
        // Even-numbered chunks are plain text
        frag.appendChild(document.createTextNode(chunks[i]));
    }
    else {
        // Odd-numbered chunks are surrogate pairs
        // We have TWO characters, but we want one codepoint; this is how
        // you decode UTF-16  :(
        var pair = chunks[i];
        var codepoint = (
            0x10000
            | ((pair.charCodeAt(0) - 0xD800) << 10)
            | (pair.charCodeAt(1) - 0xDC00)
        );
        var hex = codepoint.toString(16);  // now it's in hex
        var img = document.createElement('img');
        img.src = "https://abs.twimg.com/emoji/v1/72x72/" + hex + ".png";
        // Twitter uses pretty big images and just scales them down
        // clientside; you could change these to whatever you want, or add
        // a class here and use CSS to set the width/height to 1em to
        // match the current font size
        img.height = 16;
        img.width = 16;
        frag.appendChild(img);
    }
}

// Now just stick it into the page somewhere
var el = document.createElement('p');
el.appendChild(frag);
document.body.appendChild(el);

这会创建一个 <img>根据选项 3,但您也可以轻松添加 <span class="emoji">然后选择选项 2。或者做任何你想做的事情,比如用它们的 Unicode 名称替换表情符号。 (Twitter 在每张图片上的 Unicode 名称为 title,但这里没有这样做,因为它需要包含一个巨大的列表,将代码点映射到名称 ☺)

关于javascript - 渲染或删除表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070515/

有关javascript - 渲染或删除表情符号的更多相关文章

  1. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  10. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

随机推荐