将字符转换为HTML在R中

18
在R中,将包含非ASCII字符的字符(向量)转换为html的首选方法是什么?例如,我想将以下内容转换:
  "ü"

为了

  "ü"

我知道这可以通过巧妙使用gsub实现(但有没有人已经一劳永逸地做到了呢?),我认为R2HTML包可以做到,但事实并非如此。
编辑:以下是我最终使用的代码;显然,可以通过修改字典来扩展它:
char2html <- function(x){
  dictionary <- data.frame(
    symbol = c("ä","ö","ü","Ä", "Ö", "Ü", "ß"),
    html = c("&auml;","&ouml;", "&uuml;","&Auml;",
             "&Ouml;", "&Uuml;","&szlig;"))
  for(i in 1:dim(dictionary)[1]){
    x <- gsub(dictionary$symbol[i],dictionary$html[i],x)
  }
  x
}

x <- c("Buschwindröschen", "Weißdorn")
char2html(x)

听起来像是这个链接:https://dev59.com/em445IYBdhLWcg3wDWGc 可能会指引你朝着正确的方向前进。 - Phil Nelson
2
是的,那是另一种方法 :) 我刚刚检查了XML包:它有一个toHTML函数,但那并不能解决上述问题。这似乎是一件非常基础的事情:每个所见即所得的html编辑器都可以做到。 - Philipp
只是出于好奇,为什么在 UTF-8 的时代你仍需要这个? - feeela
我正在使用一种内容管理系统,它只允许我提供“纯”HTML,但我的一些数据是UTF-8编码的。 - Philipp
有没有简单的方法来执行与您的函数当前所执行的相反操作?我想将"&uuml;"转换为对应的字符。你有什么想法吗? - petergensler
2个回答

3

这个问题很老了,但我找不到任何简单明了的答案... 所以我想出了这个简单的函数,它使用数字 HTML 代码,并适用于 LATIN 1 - Supplement(整数值为 161 到 255)。可能(肯定?)某个包中有更全面的函数来做到这一点,但下面的内容对许多应用程序来说可能已经足够了...

conv_latinsupp <- function(...) {
  out <- character()
  for (s in list(...)) {
    splitted <- unlist(strsplit(s, ""))
    intvalues <- utf8ToInt(enc2utf8(s))
    pos_to_modify <- which(intvalues >=161 & intvalues <= 255)
    splitted[pos_to_modify] <- paste0("&#0",  intvalues[pos_to_modify], ";")
    out <- c(out, paste0(splitted, collapse = ""))
  }
  out
}

conv_latinsupp("aeiou", "àéïôù12345")
## [1] "aeiou"   "&#0224;&#0233;&#0239;&#0244;&#0249;12345"

1

XML使用insertEntities方法来实现,但该方法是内部方法。因此,您可以自行决定是否使用它,因为不能保证它在未来版本中仍能像现在这样运行。

目前,您的代码可以使用以下方式完成

char2html <- function(x) XML:::insertEntities(x, c("ä"="auml", "ö"="ouml",))

使用命名列表而不是数据框感觉很优雅,但并没有改变核心问题。在幕后,insertEntities以与您的代码相同的方式调用gsub

如果数字HTML实体在您的环境中有效,则可以使用utf8ToInt将所有文本转换为数字HTML实体,然后将安全可打印的ASCII字符转换回未转义形式。这将使您免于维护实体字典的麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接