在R中将字符串转换为十六进制

Convert string to HEX in R

我到处寻找答案,但找不到合适的答案。我需要将字符串转换为 R 中的特定编码,但无法这样做:

string <- "überhaupt"

我需要的是:“überhaupt”

到目前为止我使用的以下功能:

textutils::HTMLencode(string) gives:  "&uuml;berhaupt"
utf8::utf8_print(string, utf8 = F) gives:  "\u00fcberhaupt"
iconv(string, from = "windows-1252", "utf-8") gives: "überhaupt"

看来我需要十六进制数字字符参考https://en.wikipedia.org/wiki/%C3%9C但我不知道如何转换

感谢您的帮助

看来您需要该页面的“数字字符参考”编码。我不确定是否有内置函数,但这是编写此类函数的一次尝试

char_ref_encode <- function(x) {
  cp <- charToRaw(x)
  parts <- rle(cp>127)
  with(parts, {
    starts <- head(cumsum(c(0, lengths)), -1) + 1
    ends <- cumsum(lengths)
    paste0(mapply(function(v, start, end) {
      if (v) {
        paste(sprintf("&#x%02x;", as.numeric(cp[start:end])), collapse="")
      } else {
        intToUtf8(cp[start:end])
      }
    }, values, starts, ends), collapse="")
  })
}

char_ref_encode("überhaupt")
# [1] "&#xfc;berhaupt"

基本思路是查找所有 non-ascii 个字符,然后用它们的十六进制值对它们进行编码。

我现在找到了完美的答案。所以它应该适用于所有系统:

function(x){
x%>%
str_extract_all(., "[:print:]")%>%
map(.x = ., ~stringi::stri_escape_unicode(.x))%>%
map(.x = ., ~str_replace_all(.x, "\\u0*", "&#x" ))%>%
map(.x = ., ~case_when(
str_detect(.x, "&#x") ~ str_c(.x, ";"),
T ~.x))%>%
map(.x =., ~str_c(.x, collapse = ""))%>%
unlist()
}

感谢@MrFlick 的帮助!