stri_unescape_unicode()在某些字符

时间:2018-06-07 08:55:51

标签: r unicode encoding character-encoding stringi

我在转换R中的unicode字符时遇到问题。我正在遵循this方法,但在某些情况下,来自库stri_unescape_unicode的{​​{1}}无法返回正确的值。让我举一个例子,正确的值应该是单词Tomáš

stringi

但是,如果šU+0161而不是U+009A表示,则一切都按预期工作:

library(stringi)
test <- "Tom<U+00E1><U+009A>"
test <- gsub("<U\\+(....)>", "\\\\u\\1", test)
stri_unescape_unicode(test)
[1] "Tomá\u009a"

现在,我的问题是我有大test2 <- "Tom<U+00E1><U+0161>" test2 <- gsub("<U\\+(....)>", "\\\\u\\1", test2) stri_unescape_unicode(test2) [1] "Tomáš" 个向量,其中包含许多元素,例如characterteststri_unescape_unicode这样的某些字符上失败。我的问题是:

  • 有没有办法用<U+009A>或任何其他方法转换<U+009A>
  • 或者,有没有办法在stri_unescape_unicode失败的情况下自动替换unicodes?也就是说,在我的示例中,stri_unescape_unicode应该成为"Tom<U+00E1><U+009A>"

1 个答案:

答案 0 :(得分:0)

看来stri_unescape_unicode()并没有失败。该字符已转换,但是它是控制字符(“单个字符介绍器” U + 009A),并使用其代码进行打印。垃圾进,垃圾出。

R如何打印Unicode字符串取决于控制台的类型和使用的语言环境。在Windows中,使用代码页1252通过reprex包运行了以下示例。即使无法打印的字符是使用<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)等)来说很简单。