[英]stri_unescape_unicode() fails on some characters
我有一个转换Unicode字符在R.我下面一个问题, 这种做法,但stri_unescape_unicode
从库stringi
未能在某些情况下返回正确的值。 让我显示一个示例,其中正确的值应为单词Tomáš :
library(stringi)
test <- "Tom<U+00E1><U+009A>"
test <- gsub("<U\\+(....)>", "\\\\u\\1", test)
stri_unescape_unicode(test)
[1] "Tomá\u009a"
但是,如果š由U + 0161而不是U + 009A表示 ,则所有操作均按预期进行:
test2 <- "Tom<U+00E1><U+0161>"
test2 <- gsub("<U\\+(....)>", "\\\\u\\1", test2)
stri_unescape_unicode(test2)
[1] "Tomáš"
现在,我的问题是我的character
向量很大,包含许多元素,例如test
和stri_unescape_unicode
在某些字符上失败,例如<U+009A>
。 我的问题是:
stri_unescape_unicode
或任何其他方法转换<U+009A>
? stri_unescape_unicode
失败的情况下自动替换unicode? 也就是说,在我的示例中, "Tom<U+00E1><U+009A>"
"Tom<U+00E1><U+0161>"
? 看来stri_unescape_unicode()
并未失败。 该字符已转换,但是它是控制字符(“单个字符介绍器” U + 009A),并使用其代码进行打印。 垃圾进垃圾出。
R如何打印Unicode字符串取决于控制台的类型和使用的语言环境。 在Windows中,使用代码页1252通过reprex
包运行了以下示例。 即使使用
<U+>
或\\u\u003c/code>样式打印了不可打印的字符,实际的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()
encodeString()
结合可以像上面那样用于检测具有不良字符的字符串,即在当前语言环境中不可打印的字符。 然后,如果看来U + 009A的所有情况实际上都应该是U + 0161,则解决这些问题对于gsub()
来说很简单,例如gsub("\", "\š", unesc2)
等。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.