我正在将数据从数据库中拉到R中。我使用以下命令来做到这一点:
drv = dbDriver("MySQL")
con = dbConnect(drv,<credentials>)
dbSendQuery(con,"SET character_set_results = utf8;")
<code to pull data>
数据以 UTF-8 编码存储在数据库中。我拉一个数据框,其中包含一列包含单词的列。提取数据后,我使用iconv(x,"UTF-8","ASCII//TRANSLIT")
将编码转换为 ASCII // TRANSLIT ,一切工作正常,除了几个单词,我在更改编码后看到一个额外的字符。例如,当您查看数据库时,您会看到abc
,而当您导入数据库时,您将得到abc
。但是,一旦您将编码更改为 ASCII // TRANSLIT ,该词就会更改为abc?
。我用https://www.branah.com/unicode-converter检查编码。我在名为unicode文本的第一个框中复制了单词 abc ,在名为utf-8文本的框中看到了abcâ。这些特殊字符是什么以及如何在正则表达式中使用它们过滤掉这些?
答案 0 :(得分:0)
SET character_set_results = utf8
可能还不够。更改为SET NAMES utf8mb4
。
“拉数据”是什么意思?是否放入数据库表中?如果是这样,请提供SHOW CREATE TABLE
。
要调查奇怪的字符,请执行SELECT HEX(...) ...
以查看实际存在的内容。由此,我们也许可以推断出发生了什么。
â¬
似乎是其中之一的Mojibake的一部分。
⬀,⬁,⬂,⬃,⬄,⬅,⬆,⬇,⬈,⬉,⬊,⬋,⬌,⬍,⬎,⬏,⬐,⬑,⬒,⬓,⬔,⬕,⬖,⬗,⬘, ⬙,⬚,⬛,⬜,⬝,⬞,⬟,⬠,⬡,⬢,⬣,⬤,⬥,⬦,⬧,⬨,⬩,⬪,⬫,⬬,⬭,⬮,⬯,⬰,⬱, ⬲,⬳,⬴,⬵,⬶,⬷,⬸,⬹,⬺,⬻,⬼,⬽,⬾,⬿
â¬, when treated as latin1, is hex E2AC
⬀ when treated as UTF-8 (utf8mb4), is hex E2AC80
⬁ is hex E2AC81,
etc
here中讨论了Mojibake的原因。
您应该修复代码以保留它们,而不是尝试将它们过滤掉。