使用<U + 0092> Unicode字符的字符串出现问题

Del*_*eet 11 unicode encoding r

我有一个非常大的数据集(70k行,2600列,CSV格式),我通过网络抓取创建.不幸的是,在某些时候进行预处理,处理等一些有问题的字符已经以奇怪的方式编码并且我在处理它们时遇到了问题.

我有如下字符串:

x = "but it doesn<U+0092>t matter"
Run Code Online (Sandbox Code Playgroud)

查找代码,我们可以看到它应该是实际应该是的字符'(数据是用户生成的,因此可能包含各种奇数字符).虽然从看这个角色,似乎人也有它(问题1,2,3).它被标记为一个控制角色,不知道那是什么,但也许这就是为什么它很难处理.

关于R中的Unicode的大多数其他问题都是以这样的格式关注Unicode \u0092.

只是用 Encoding()

我们试试吧:

#> x = "but it doesn<U+0092>t matter"
#> Encoding(x)
#[1] "unknown"
#> Encoding(x) = "UTF-8"
#> Encoding(x)
#[1] "unknown"
#> x
#[1] "but it doesn<U+0092>t matter"
Run Code Online (Sandbox Code Playgroud)

所以这似乎没有做任何事情.

使用以前这些问题中的hack函数

有一些先前的问题涉及这种Unicode格式并尝试转换它们:

奇怪的是,他们给出了工作的例子,但我的却没有.

#> test.string <- "This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
#> Encoding(test.string)
#[1] "unknown"
#> to_true_unicode(test.string)
#[1] "This is a ? ? ? ? test ? string."
Run Code Online (Sandbox Code Playgroud)

但:

#> x2 = to_true_unicode(x)
#> x2
#[1] "but it doesn\u0092t matter"
#> cat(x2)
#but it doesnt matter
#> Encoding(x2)
#[1] "UTF-8"
Run Code Online (Sandbox Code Playgroud)

因此,它设法转换为\u< U+....>format的格式,并使用cat()打印没有该符号的字符(或SO上的错误符号).

只需手动搜索并替换它们

我只有有限数量的这些问题,所以我可能只是使用搜索替换来解决它.然而:

#> #base-r
#> gsub(x = x, pattern = "<U+0092>", replacement = "'")
#[1] "but it doesn<U+0092>t matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x, pattern = "<U+0092>", "'")
#[1] "but it doesn<U+0092>t matter"
Run Code Online (Sandbox Code Playgroud)

所以替换似乎不起作用,但它确实适用于\u版本:

#> #base-r
#> gsub(x = x2, pattern = "\u0092", replacement = "'")
#[1] "but it doesn't matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x2, pattern = "\u0092", "'")
#[1] "but it doesn't matter"
Run Code Online (Sandbox Code Playgroud)

因此,这表明了一种工作方法:1)将<U+>格式转换为\u格式,然后使用搜索替换.

Unescape与 stringi::stri_unescape_unicode()

似乎不适用于任何一个版本:

#> stringi::stri_unescape_unicode(x)
#[1] "but it doesn<U+0092>t matter"
#> stringi::stri_unescape_unicode(x2)
#[1] "but it doesn\u0092t matter"
Run Code Online (Sandbox Code Playgroud)

是否有一些普遍适用的方式来处理这样的问题?

我的设置

我的sessionInfo是:

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Danish_Denmark.1252  LC_CTYPE=Danish_Denmark.1252    LC_MONETARY=Danish_Denmark.1252
[4] LC_NUMERIC=C                    LC_TIME=Danish_Denmark.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] stringr_1.0.0

loaded via a namespace (and not attached):
[1] magrittr_1.5  tools_3.2.3   stringi_1.0-1
Run Code Online (Sandbox Code Playgroud)

在Windows 8.1,64位上通过RStudio(0.99.893,预览)运行R.键盘和时间单位是丹麦语,但其他一切都是英语.

wot*_*ter 6

不确定它是否适合你,但对于同样的症状,我确实将字符串转换为 ascii:

x <- iconv(x, "", "ASCII", "byte")
Run Code Online (Sandbox Code Playgroud)

对于非 ascii 字符,指示是"<xx>"字节的十六进制代码。

然后,您可以将十六进制代码 gsub 为适合您的值。


gla*_*ugh 5

我因为这个有害的小问题度过了一段可怕的时光,但我想/希望我终于有所收获。

在搞乱了这些read_csv选项locale=locale(encoding="xyz")并尝试了其他解决方案的各种组合之后 - 该gsub解决方案不起作用,我尝试了该stringi解决方案......

它也不起作用。但它有一个函数str_enc_detect,我在问题值上运行了它stri_enc_detect(x)。它给了我一个我没有尝试过的区域设置 - 在本例中为 windows-1252 - 我立即在 read_csv 选项中设置了它:locale=locale(encoding = "windows-1252")

嘿,现在已经正确显示了。