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

4

我四处寻找答案,但没有找到正确的答案。我需要在 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,但我不知道如何进行转换。

感谢您的帮助。

2个回答

4

看起来您需要从该页面获取“数字字符引用”编码。我不确定是否有内置函数可实现此功能,但以下是一种尝试编写这样一个函数的方法:

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"

基本思想是查找所有的非ASCII字符,然后用它们的十六进制值进行编码。

非常感谢。这几乎是完美的,但当一个单词中有超过2个特殊字符时似乎会失败:char_ref_encode("größten") 的输出是:grten 但我需要的是:größten - Waschi Waschoi
@WaschiWaschoi 如果这是您期望的输出结果,那么我已经更新了该函数。 - MrFlick
太好了!非常感谢。我会尝试理解这个函数的作用 :) - Waschi Waschoi
如果我使用utf8::as_utf8("größten"),结果会有所不同。需要更改什么才能获得确切的结果größten?背景:我不确定其他用户将使用哪个操作系统,因此我认为as_utf8是一种备用解决方案。 - Waschi Waschoi
好的,你提供的输出只适用于latin1编码(Windows默认)。如果这是你需要的输出,那么你需要确保将数据编码为latin1而不是utf8(这与大多数人的做法相反)。 - MrFlick

-2

我现在找到了完美的答案。所以它应该在所有系统上都能正常工作:

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 的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接