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)
4

2 回答 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"
于 2018-12-10T20:15:56.410 回答
1

为此使用XML了一种方法insertEntities,但该方法是内部的。因此,您可以自行承担使用它的风险,因为无法保证它在未来的版本中仍会像这样运行。

现在,您的代码可以使用

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

使用命名列表而不是 data.frame 感觉有点优雅,但不会改变事物的核心。在后台,insertEntities调用gsub方式与您的代码大致相同。

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

于 2012-10-23T22:06:25.883 回答