将 utf8 解码为 python/R 中的常规字符
Decode utf8 to regular characters in python/R
我有各种字符串,例如xc3\x93\xc5\x81
这些是编码的 UTF-8 字符。我唯一可以访问的文件是那些编码值。我如何在 R 或 python 中将其解码为常规字符(不是这个 UTF-8 俚语)?
在 R 中,我们可以在 处使用@Jeroen 的函数,稍作修改以处理 \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"
由 reprex package (v0.2.1)
于 2019-04-15 创建
我有各种字符串,例如xc3\x93\xc5\x81
这些是编码的 UTF-8 字符。我唯一可以访问的文件是那些编码值。我如何在 R 或 python 中将其解码为常规字符(不是这个 UTF-8 俚语)?
在 R 中,我们可以在 处使用@Jeroen 的函数,稍作修改以处理 \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"
由 reprex package (v0.2.1)
于 2019-04-15 创建