闪亮应用中的Unicode文本

时间:2018-08-03 15:04:08

标签: r unicode shiny

我正在尝试输出包含表情符号的Shiny打印文本。不幸的是,它似乎没有打印表情符号,而是打印了不同符号的Unicode数字,如下所示:

enter image description here

这是Shiny不处理表情符号的简单示例。它会从emoji.json文件中加载三个表情符号:

{"emoji":["","",""]}

并仅渲染app.R

中的文本
library(jsonlite)
library(shiny)
library(tidyverse)
ui <- fluidPage(textOutput("emoji"))
server <- function(input, output) {
   output[["emoji"]] <- renderText({
     "emoji.json" %>% 
     read_json() %>% 
     .[["emoji"]] %>% 
     str_c(collapse="")
   })
}
shinyApp(ui = ui, server = server)

感觉好像我必须在某个地方做一些转换,但是我不知道该怎么做。同样,这是在使用R版本3.5.0的Windows 10计算机上完成的。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这取决于您的emoji.json文件的编码。当我将示例文件复制到TextEdit(在Mac上)时,将其转换为纯文本,并以.json编码保存为UTF-8,表情符号在TextEdit和您发布的闪亮应用。

我虽然问题可能是由于编码所致,所以我用与其对应的十六进制替换了表情符号,并用Western (Windows Latin 1)编码保存了文件,使它们显示为十六进制数字的纯文本。

要使它们正确显示在Shiny中,只需要结合as.integer从十六进制转换和intToUtf8使其变为UTF8字符即可。

带有Western (Windows Latin 1)编码的表情符号十六进制表示形式的JSON文件:

{"emoji":["0x0001F605","0x0001F612","0x0001F62B"]}

闪亮的应用程序:

library(jsonlite)
library(shiny)
library(tidyverse)
ui <- fluidPage(textOutput("emoji"))
server <- function(input, output) {
    output[["emoji"]] <- renderText({
        "emoji3.json" %>% 
            read_json() %>% 
            .[["emoji"]] %>% 
            sapply(function(x) {
                intToUtf8(as.integer(x))
            }) 
    })
}
shinyApp(ui = ui, server = server)

表情符号正确显示:

The Emoji are properly displayed