r语言 - 用单反斜杠代替双斜杠



我需要找到一种方法来代替"\"通过"";更具体地说,我有如下编码的文本数据:

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"   

相关内容

  • 没有找到相关文章

最新更新