我需要找到一種使用 R 將字串中的“\\”替換為“\”的方法。更具體地說,我有如下編碼的文本資料:
text <- c("K\\xc3\\xb6nnen", "S\\xc3\\xbcd")
我想將其轉換為 UTF-8,這將產生以下結果:
c("K?nnen", "Süd")
但是,上面的資料有太多的反斜杠來轉換它,即我需要將文本向量更改為:
text_correct <- c("K\xc3\xb6nnen", "S\xc3\xbcd")
這將使編碼資料變得非常容易:
library(utf8)
as_utf8(text_correct)
我已經用谷歌搜索了很多,但找不到使用 gsub 或類似命令將“\\”替換為“\”的方法。我很感激任何幫助。
uj5u.com熱心網友回復:
盡管有外觀,但您的字串中沒有雙反斜杠。有單個反斜杠。當您想在 R 中的字串中使用單個反斜杠時,您需要輸入兩個反斜杠,如您的示例中所示。
這是因為在 R 字串中,單個反斜杠表示您正在開始一個轉義序列。轉義序列可以輸入難以處理的字符。例如,如果我想要一個換行符,我的字串將是"\n". 這不是在內部存盤為反斜杠和“n”,而是作為 ASCII 字符 0x0a,即換行符。R 決議器“看到”序列\n并將其解讀為“我想要一個換行符”。
使用反斜杠轉義的原因是我們需要一種方法來區分需要換行符和需要文字反斜杠后跟字符“n”。在后一種情況下,我們的 R 字串將是"\\n", 并將存盤為兩個 ASCII 位元組:一個用于反斜杠,一個用于小寫“n”。
您不能使用gsub將這些雙斜杠替換為單斜杠,因為沒有雙斜杠,并且替換沒有任何斜杠。盡管該序列\xc3看起來有反斜杠,但實際上沒有。這只是你告訴 R 你想要字串中的單個 ASCII 字符 0xc3 的方式。
本質上,您的輸入字串已被“雙重轉義”,并且要將這些\\xc3條目轉換為它們應該表示的位元組,您需要對它們進行轉義。
即使這樣,編碼也不是正確 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"
uj5u.com熱心網友回復:
我認為@allan-cameron 提出的解決方案應該適用于 Windows 用戶。對于 mac 用戶,我沒有找到比這更好/不那么殘酷的解決方案:
(1) 從https://www.i18nqa.com/debug/utf8-debug.html復制表格 并保留“預期”和“實際”列
(2)按“實際”中的字符數對表格進行排序,從最長的字串開始,另存為conversion.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"
uj5u.com熱心網友回復:
這適用于 R 4.2 中的 Windows。
現在,如果字串是用單個反斜杠撰寫的,它會起作用:
c("K\xc3\xb6nnen", "S\xc3\xbcd")
## [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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488875.html
