В R мы могли бы использовать функцию @ Jeroen в https://stackoverflow.com/a/24958365/6197649, с небольшим изменением, чтобы иметь дело с \xnn
, а не \unnnn
unescape_unicode <- function(x){
#single string only
stopifnot(is.character(x) && length(x) == 1)
#find matches
m <- gregexpr("(\\\\)+x[0-9a-z]{2}", x, ignore.case = TRUE)
if(m[[1]][1] > -1){
#parse matches
p <- vapply(regmatches(x, m)[[1]], function(txt){
gsub("\\", "\\\\", parse(text=paste0('"', txt, '"'))[[1]], fixed = TRUE, useBytes = TRUE)
}, character(1), USE.NAMES = FALSE)
#substitute parsed into original
regmatches(x, m) <- list(p)
}
x
}
f <- tempfile()
cat("\\xc3\\x93\\xc5\\x81\n", file = f)
fpeek::peek_head(f)
#> \xc3\x93\xc5\x81
x <- readLines(f)
unlink(f)
unescape_unicode(x)
#> [1] "ÓŁ"
Интересно, stringi::stri_escape_unicode
дает другой результат, по-видимому, неправильно интерпретируя \xc3\x93
как два отдельных символа (когда должен быть только одним, "\xc3\x93" == "\u00d3"
, но я не понимаю, какое соглашение это определяет, я был бы признателенвклад от кого-то с большей ясностью в теме в комментариях)
stringi::stri_unescape_unicode(x)
#> [1] "Ã\u0093Å\u0081"
Создано в 2019-04-15 пакетом Представить (v0.2.1)