由于文本字符串有问题,无法打开导出的 Excel 文件

Can't open exported Excel file due to problematic text string

我有以下数据:

structure(list(QB5B_2 = structure("Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas d'accord entre elles sur la stratégie à adopter en ce qui les concerne . Exemple les Gafa payent des impots en Irlande car leurs si<ef>", label = "test", format.spss = "A255", display_width = 0L)), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

当我在 RStudios 视图窗格中查看此数据时,它看起来像正确的法语文本:

View(problem) 显示:

但是,当查看控制台中的数据时,它给了我:

# A tibble: 1 x 1
  QB5B_2                                                                                                                 
  <chr>                                                                                                                  
1 "Car les GAFA sont des soci\xc3\xa9t\xc3\xa9s Am\xc3\xa9ricaines et de plus les gouvernements qui composent l'Union Eu~

很明显存在一些字符编码问题。

现在,当我尝试将文件导出到 Excel 时:

library(writexl)
write_xlsx(problem, "test.xlsx")

它执行导出,但我无法打开 Excel 中的文件,而是收到一条错误消息,指出遇到了问题。旁注:我可以完美地导入 Excel 文件,例如readxl::read_xlsx("test.xlsx")

所以两个问题:

我怀疑文本实际上编码为 latin1,但编码设置为 UTF-8。所以 R 试图读取 latin1,就好像它是 UTF-8 一样,但弄错了。

# by default, R used latin1
> Encoding(problem$QB5B_2)
[1] "latin1"

# in that case, no problem to display it
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui com~

# But the API set it as UTF-8
> Encoding(problem$QB5B_2) <- "UTF-8"
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des soci\xe9t\xe9s Am\xe9ricaines et de plus les gouvernemen~

# You just need to convert the encoding back
> Encoding(problem$QB5B_2) <- "latin1"
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui com~

另请参阅 ?Encoding 中的第一个示例,它非常相似。在法语计算机上,语言环境将设置为 latin1,您可以使用 enc2native().

有些事情很奇怪,因为您的输入在文本前显示了一个双引号,这在小标题中显示 character-column 的内容时通常不会发生。在“1”之后看:

# A tibble: 1 x 1
 QB5B_2                                                                                                                 
 <chr>                                                                                                                  
1 "Car les GAFA sont des soci\xc3\xa9t\xc3\xa9s Am\xc3\xa9ricaines et de plus les gouvernements qui composent l'Union Eu~

也许解决方案是使用 iconv():

重新编码变量
problem$QB5B_2 <- iconv(problem$QB5B_2, sub = "byte")
problem
# A tibble: 1 x 1
   QB5B_2                                                                                                                
   <chr>                                                                                                                 
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas …

另一种方法是删除第一个字符:

problem$QB5B_2 <- str_remove(problem$QB5B_2, pattern = "$.")
problem
# A tibble: 1 x 1
   QB5B_2                                                                                                                
   <chr>                                                                                                                 
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas …

这并没有说明如何首先避免该问题,但它应该可以解决您的问题。

这里调试的难点是dput(),你可能用来复制内容不保留的问题...