Подтвердить что ты не робот

Преобразование символа в html в R

Какой предпочтительный способ в R преобразовать символ (вектор), содержащий символы, отличные от ASCII, в html? Например, я хотел бы преобразовать

  "ü"

к

  "ü"

Я знаю, что это возможно с помощью умного использования gsub (но кто-нибудь это сделал раз и навсегда?), и я подумал, что пакет R2HTML сделает это, но это не так.

EDIT: Вот что я в итоге использовал; его можно, очевидно, расширить, изменив словарь:

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

Ответ 1

Для этого XML использует метод insertEntities, но этот метод является внутренним. Таким образом, вы можете использовать его на свой страх и риск, так как нет никаких гарантий того, что он будет продолжать работать как в будущих версиях.

В настоящий момент ваш код может быть выполнен с помощью

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

Использование именованного списка вместо data.frame кажется элегантным, но не меняет сути вещей. Под капотом insertEntities вызывает gsub во многом так же, как ваш код делает.

Если числовые объекты HTML действительны в вашей среде, то вы, вероятно, могли бы преобразовать весь текст в те, которые используют utf8ToInt, а затем вернут безопасно печатаемые символы ASCII обратно в неэкранированную форму. Это избавит вас от необходимости поддерживать словарь для ваших объектов.

Ответ 2

Этот вопрос довольно старый, но я не смог найти однозначного ответа... Поэтому я придумал эту простую функцию, которая использует числовые HTML-коды и работает для LATIN 1 - Дополнение (целые значения от 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"