Похоже, что stri_unescape_unicode()
не удалось.Символ был преобразован, но он является управляющим символом («односимвольный вводчик» U + 009A) и печатается с использованием его кода.Мусор входит, мусор выходит.
Как R печатает строки Unicode, зависит от типа консоли и используемой локали.Следующий пример был запущен через пакет reprex
с использованием кодовой страницы 1252 в Windows.Даже если непечатаемый символ печатается в стиле <U+>
или \u
, фактический символ Unicode существует в соответствующей строке R.
library(stringi)
test2 <- c("Tom<U+00E1><U+009A>", "Tom<U+00E1><U+0161>")
test2 <- gsub("<U\\+(....)>", "\\\\u\\1", test2)
unesc2 <- stri_unescape_unicode(test2)
unesc2
#> [1] "Tomá<U+009A>" "Tomáš"
nchar(unesc2)
#> [1] 5 5
cap2 <- capture.output(cat(unesc2, sep = "\n"))
cap2
#> [1] "Tomá<U+009A>" "Tomáš"
nchar(cap2)
#> [1] 12 5
which(nchar(cap2) > nchar(unesc2))
#> [1] 1
es2 <- encodeString(unesc2)
es2
#> [1] "Tomá\\u009a" "Tomáš"
nchar(es2)
#> [1] 10 5
which(nchar(es2) > nchar(unesc2))
#> [1] 1
Я думаю, capture.output()
или encodeString()
в сочетании сnchar()
можно использовать, как указано выше, для обнаружения строк с плохими, то есть непечатаемыми в текущей локали символами.Затем, если кажется, что все случаи U + 009A должны быть на самом деле U + 0161, исправить это - простая задача для gsub()
, например, gsub("\u009a", "\u0161", unesc2)
и т. Д.