我需要找到一种方法来代替"\"通过"";更具体地说,我有如下编码的文本数据:
text <- c("K\xc3\xb6nnen", "S\xc3\xbcd")
我想将其转换为UTF-8,这将得到以下结果:
c("Können", "Süd")
但是,上面的数据有太多的反斜杠来转换它,即我需要将文本向量更改为:
text_correct <- c("Kxc3xb6nnen", "Sxc3xbcd")
这将使编码数据变得非常容易:
library(utf8)
as_utf8(text_correct)
我已经谷歌了很多,但找不到一个方法来代替"\"通过"";这使用gsub或类似的命令。我很感激你的帮助。
尽管有,但在字符串中没有双反斜杠。有单个反斜杠。当您希望在R中的字符串中有一个反斜杠时,您需要键入两个反斜杠,如您的示例所示。
这是因为在R字符串中,单个反斜杠表示您正在开始转义序列。转义序列使得输入原本难以处理的字符成为可能。例如,如果我想要一个换行字符,我的字符串将是"n"
。这是,而不是内部存储为反斜杠和"n",而是作为ASCII字符0x0a,即换行字符。R解析器"看到"序列n
并将其读取为"我想要一个换行字符"。
使用反斜杠转义的原因是我们需要一种方法来区分,比如说,想要一个换行字符和想要一个后跟字符'n'的字面反斜杠。在后一种情况下,我们的R字符串将是"\n"
,并将被存储为两个ASCII字节:一个用于反斜杠,另一个用于小写的'n'。
您不能使用gsub
来替换这些双斜杠为单斜杠,因为没有双斜杠,并且替换没有任何斜杠。虽然序列xc3
看起来像它有一个反斜杠,它没有。这只是你告诉R你想在字符串中使用单个ASCII字符0xc3的方式。
基本上你的输入字符串已经被"双转义",并且要将这些\xc3
条目转换为它们应该表示的字节,你需要unescape它们。
即使这样,编码也不是正确的UTF-8字符的按字节表示,所以您需要使用stringi::stri_unescape_unicode
对字符串进行反转义,而是将其转换为本机编码,然后重新解释为UTF-8:
text <- c("K\xc3\xb6nnen", "S\xc3\xbcd")
text <- enc2native(stringi::stri_unescape_unicode(text))
Encoding(text) <- 'UTF-8'
text
#> [1] "Können" "Süd"
这适用于我的Windows在R 4.2。海报上说这在他的Mac上也行得通。
现在,如果用单个反斜杠写字符串,它就可以工作了:
c("Kxc3xb6nnen", "Sxc3xbcd")
## [1] "Können" "Süd"
但是对于解析器来说,字符串中的双反斜杠是一个单反斜杠,所以只需解析它并将其转换为字符。没有使用包。
text <- c("K\xc3\xb6nnen", "S\xc3\xbcd")
as.character(str2expression(sprintf('"%s"', text)))
## [1] "Können" "Süd"
也可以写成管道。
text |>
sprintf(fmt = '"%s"') |>
str2expression() |>
as.character()
在R 4.1中,为了使其工作,将编码更改为UTF-8。
result <- as.character(str2expression(sprintf('"%s"', text)))
Encoding(result) <- "UTF-8"
我认为@allan-cameron提出的解决方案应该适用于windows用户。对于mac用户,我没有找到比这更好/更不残酷的解决方案了:
(1)从https://www.i18nqa.com/debug/utf8-debug.html复制表保持栏目"预期"one_answers"actual">
(2)按"Actual"中的字符数排序,从最长的字符串开始,并保存为convert .csv
(3)运行以下代码:
# Read conversion table:
conversion <- read.csv2("conversion.csv", sep=",")
# Run code suggested above
text <- c("K\xc3\xb6nnen", "S\xc3\xbcd")
text <- enc2native(stringi::stri_unescape_unicode(text))
# this gives: "KÁ¶nnen" "SÁ¼d"
# next, loop over conversion table and manually replace miscodings:
for(i in 1:nrow(conversion)){
text <- gsub(conversion$actual[i],conversion$expected[i], text)
}
text
# this returns: "Können" "Süd"