Декодировать utf8 в обычные символы в python/R

У меня есть различные строки, такие как, например. xc3\x93\xc5\x81 это символы в кодировке UTF-8. Единственный файл, к которому у меня есть доступ, - это с этими закодированными значениями. Как я могу декодировать это в R или Python в обычные символы (не этот сленг UTF-8)?


person mkropkowski    schedule 15.04.2019    source источник
comment
Попробуйте использовать метод строк decode().   -  person eiram_mahera    schedule 15.04.2019
comment
В R попробуйте stringi::stri_unescape_unicode   -  person Aurèle    schedule 15.04.2019


Ответы (1)


В 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"

Создано 15 апреля 2019 г. с помощью пакета reprex (v0.2.1)

person Aurèle    schedule 15.04.2019