gsub()正则表达式删除R中的åäö(UTF-8编码)

时间:2015-02-16 23:02:35

标签: regex r twitter encoding utf-8

我是,使用TwitteR软件包从twitter下载推文。推文被下载并存储在MySQL数据库中。我想摆脱所有“未知的角色”。问题是gsub()将我的åäö字符转换为aao。这里我提取了一行作为例子:

> testing <- outputdata$text[396]
> stri_enc_mark(testing) # Gets declared encodings for each string
[1] "UTF-8"
> Encoding(testing) # Reads the declared encodings
[1] "UTF-8"
> all(stri_enc_isutf8(testing)) # check if every character is UTF-8
[1] TRUE
> testing <- gsub("[^0-9A-Za-z@#:åäöÅÄÖ///' ]", "", testing,)
> testing
[1] "Mycket bra intervju med Sapo chefen Anders Tjornberg pa TV4 alldeles nyss  "

在运行gsub()之前,推文看起来很喜欢这个:

"Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  ��"

如果我尝试以下代码,gsub()不会将åäö转换为aao ...问题是,当我复制过去时它工作但不是从数据框加载时。

> testing <- "Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  ��"
> stri_enc_mark(testing)
[1] "UTF-8"
> Encoding(testing)
[1] "UTF-8"
> all(stri_enc_isutf8(testing))
[1] TRUE
> testing <- gsub("[^0-9A-Za-z@#:åäöÅÄÖ///' ]", "", testing,)
> testing
[1] "Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  "

我尝试过使用:

outputdata$text <- iconv(outputdata$text, to = "UTF-8", sub="")
outputdata$text <- iconv(outputdata$text, "UTF-8", "UTF-8",sub='')

在整个数据框上删除所有非UTF-8字符,但没有运气。我不知道这是否相关:

Encoding(outputdata$text)
[1] "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "unknown" "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"  

可能十个观察结果未知。

2 个答案:

答案 0 :(得分:0)

也许你的头衔令人困惑?我是否更正你不想用变音标记转换字符?当我使用你的文本时,gsub()完全像我想的那样工作,似乎并保留了变音符号字符(但删除了,例如,�。

> testing <- "Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  ��"
> testing2 <- gsub("[^0-9A-Za-z@#:åäöÅÄÖ///' ]", "", testing)
> testing2
[1] "Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  "
> testing3 <- "RT @K_GBergstrom: Arbetsgivaravgifterna för unga sänks 1 maj, föreslår regeringen. Sen väntas de höjas (tredubblas?) kanske 1 juli. Politik…"
> testing3 <- "RT @K_GBergstrom: Arbetsgivaravgifterna för unga sänks 1 maj, föreslår regeringen. Sen väntas de höjas (tredubblas?) kanske 1 juli. Politik…"
> testing4 <- gsub("[^0-9A-Za-z@#:åäöÅÄÖ///' ]", "", test3)
> testing4
[1] "RT @KGBergstrom: Arbetsgivaravgifterna för unga sänks 1 maj föreslår regeringen Sen väntas de höjas tredubblas kanske 1 juli Politik"

作为一个小问题,您的代码可能包含正则表达式;我怀疑mysql是否合适。

答案 1 :(得分:0)

这看起来像Unicode Normalization Forms的问题。有关可能的解释,请参阅this answer。当适应这种情况时,testing可能包含“ä”作为“a”+“组合上面的分音符”和“å”作为“a”+“上面的组合环”。 gsub()替换将组合字符剥离,只留下“a”。

作为补救措施,您可以尝试将文本字符串标准化为NFC表单。例如:

library(stringi)
testing <- "Mycket bra intervju med Säpo chefen Anders Tjornberg på TV4 alldeles nyss  ��"
## This transformation is probably unnecessary
sub_pat <- stri_trans_nfc("[^0-9A-Za-z@#:åäöÅÄÖ///' ]")

testing_nfc <- stri_trans_nfc(testing)
## This should work
gsub(sub_pat, "", testing_nfc)

testing_nfd <- stri_trans_nfd(testing)
## This should convert ä and å to a
gsub(sub_pat, "", testing_nfd)

另一个问题:重复的斜杠///没有多大意义。也许意图是保留斜杠和反斜杠,"[^0-9A-Za-z@#:åäöÅÄÖ/\\' ]"