【问题标题】:R String Encoding from "unknown"/"ASCII" to "UTF-8"从“未知”/“ASCII”到“UTF-8”的 R 字符串编码
【发布时间】:2018-11-23 10:05:33
【问题描述】:

我不确定如何将其变成可重现的示例,对此我深表歉意。但是我有一个带有字符串列的数据框。当我在该列上运行stri_enc_mark 时,我看到我有'ASCII' 和'UTF-8' 编码的字符串。这是一个问题,因为当我尝试将此数据上传到弹性搜索数据库时,会遇到以下错误:

“[Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@40d00701; line: 1, column: 1425] 处的无效 UTF-8 起始字节 0xa0\n”

我假设这是因为 ASCII 编码的字符串。我尝试使用write.csv(... fileEncoding = 'UTF-8'),但是当我加载该 CSV 时,字符串列仍然有混合编码。 Encoding(x) <- 'UTF-8'stri_enc_toutf8stri_encode 似乎都无法帮助转换。

任何建议或指导都会很棒。

【问题讨论】:

  • ASCII 字符是 UTF-8 字符的子集,因此这些字符不太可能导致问题。您正在运行什么代码会给出错误。如果没有某种reproducible example,几乎不可能提供帮助。
  • 我不知道如何重现文本编码。即使我创建了一个变量 x <- 'hello world',编码结果也是“未知”,当我尝试使用 iconv(x, 'unknown', 'UTF-8') 甚至 stri_enc_toutf8(x) 时,没有任何变化
  • 编码将是未知的,因为那里没有非 ascii 字符,所以编码并不重要。像charToRaw() 这样的函数可以输出字符串的原始字节。
  • 这实际上解决了问题。太感谢了! @MrFlick!!!!

标签: r elasticsearch utf-8 character-encoding stringi


【解决方案1】:

感谢@MrFlick,我能够解决问题。本质上,给定一个包含混合编码字符列的数据框,最简单的解决方法是:

df %>%
  mutate_if(is.character, function(x){
    x %>%
      sapply(function(y){
        y %>%
          charToRaw %>%
          rawToChar
      })
   })

这确保所有字符都以相同的native 编码进行编码。这解决了我由于编码不一致而无法将数据加载到弹性搜索中的问题。

【讨论】: