write.csv()在Mac OS和Windows 10上的结果不同?

3

在RStudio控制台上打印时看起来完全正常,但在写入csv并使用Excel打开时会出现奇怪字符的字符字符串。

可重复示例

以下代码生成了一个名为"a wit"的对象,并将其写入csv:

# install.packages("dplyr")
library(dplyr)

serialized_char <- "580a000000030003060200030500000000055554462d380000001000000001000080090000000661c2a0776974"

(string <- serialized_char %>% 
    {substring(., seq(1, nchar(.), 2), seq(2, nchar(.), 2))} %>% 
    paste0("0x", .) %>% 
    as.integer %>% 
    as.raw %>% 
    unserialize())
[1] "a wit"

write.csv(string, "myfile.csv", row.names=F)

这是从 Mojave 中编写的样子(在MacOS Mojave中用Excel查看)- 包含不良字符enter image description here 这是从 High Sierra 中编写的样子(在High Sierra中用Excel查看)- 包含不良字符enter image description here 当从 Windows 10 编写并在Windows 10上用Excel查看时,它看起来正常! enter image description here 这是从 Mojave 编写的样子,但在Windows 10上用Excel查看 - 仍然包含不良字符enter image description here

问题

我有很多这种形式的字符数据(在CSV格式下打开Excel时看起来奇怪),如何清理这些数据,使文本在Excel中呈现正常。

我尝试过的方法

我已经尝试了4件事情

write.csv(string, "myfile.csv", fileEncoding = 'UTF-8')

Encoding(string) <- "latin-1"

Encoding(string) <- "UTF-8"

iconv(string, "UTF-8", "latin1", sub=NA)

1个回答

3
问题不在于 R,而在于 Excel。
Excel 对于平台字符编码有自己的想法。值得注意的是,即使在现代 macOS 系统中,它也坚持认为平台编码自然上属于 Mac Roman,而不是实际普遍采用的 UTF-8。
默认情况下,该文件在 macOS 上正确地使用 UTF-8 进行编写。
要让 Excel 正确地读取它,需要选择“文件” › “导入…”,并从中跟随导入向导,该向导可让您指定文件编码。

@stevec 没有好的方法。你可以添加UTF-8 BOM,但是绝对每个人(包括微软!)都认为这是一种可怕的做法。从技术上讲,最好的方法可能是使用Excel自动化来编写XLSX文件。 - Konrad Rudolph
BOM 是相当老派的,我认为是吧? - stevec
没错。BOM是老派的解决方案,因为它并不好。但是Excel的这种行为也很糟糕,可以说是一个错误。 - Konrad Rudolph
非常有见识。您知道是否有一种方法可以强制上面看到的"a wit",使得identical(a_wit_from_above, "a wit")TRUE吗? - stevec
1
@stevec 这个处理重音符号以及不间断空格:iconv(stringi::stri_trans_nfkd(x), 'UTF-8', 'ASCII', sub=''); 使用它,'ä\ua0test' 将变成 'a test' - Konrad Rudolph
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接