在R中将字符串转换为十六进制
我到处寻找答案,但找不到正确的答案。我需要将字符串转换为R中的特定编码,但无法执行此操作:在R中将字符串转换为十六进制,r,utf-8,R,Utf 8,我到处寻找答案,但找不到正确的答案。我需要将字符串转换为R中的特定编码,但无法执行此操作: string <- "überhaupt" 似乎我需要十六进制数字字符引用,但我不知道如何转换 感谢您的帮助因此,您似乎希望从该页面获得“数字字符参考”编码。我不确定是否有一个内置函数,但这是编写这样一个函数的一次尝试 char_ref_encode <- function(x) { cp <- charToRaw(x) parts <- rle(cp
string <- "überhaupt"
似乎我需要十六进制数字字符引用,但我不知道如何转换
感谢您的帮助因此,您似乎希望从该页面获得“数字字符参考”编码。我不确定是否有一个内置函数,但这是编写这样一个函数的一次尝试
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] "überhaupt"
char\u ref\u encode我现在找到了完美的答案。因此,它应该适用于所有系统:
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的帮助 非常感谢你。它近乎完美,但似乎失败了,当一个单词中有两个以上的特殊字符时:char_ref_encode(“größten”)给出:gr;十个,但我需要:größ;ten@WaschiWaschoi如果这是您期望的输出,那么我已经更新了functionperfect!非常感谢。我将尝试理解函数的作用:)如果我使用utf8::as_utf8(“größten”),结果会有所不同。需要更改哪些内容才能获得准确的结果größ;十个?回溯:我不是舒尔,其他用户将使用哪种操作系统,因此我认为as_utf8是一种后备解决方案。好吧,您给出的输出仅适用于拉丁1编码(windows默认)。如果这是您需要的输出,那么您需要确保将数据编码为拉丁文1而不是utf8(这与大多数人的做法相反)。
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()
}