Преобразование символа в html в R
Какой предпочтительный способ в R преобразовать символ (вектор), содержащий символы, отличные от ASCII, в html? Например, я хотел бы преобразовать
"ü"
к
"ü"
Я знаю, что это возможно с помощью умного использования gsub
(но кто-нибудь это сделал раз и навсегда?), и я подумал, что пакет R2HTML сделает это, но это не так.
EDIT: Вот что я в итоге использовал; его можно, очевидно, расширить, изменив словарь:
char2html <- function(x){
dictionary <- data.frame(
symbol = c("ä","ö","ü","Ä", "Ö", "Ü", "ß"),
html = c("ä","ö", "ü","Ä",
"Ö", "Ü","ß"))
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)
Ответы
Ответ 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("�", intvalues[pos_to_modify], ";")
out <- c(out, paste0(splitted, collapse = ""))
}
out
}
conv_latinsupp("aeiou", "àéïôù12345")
## [1] "aeiou" "àéïôù12345"