【问题标题】:write.csv() writes a different result from Mac OS than from Windows 10?write.csv() 从 Mac OS 写入的结果与从 Windows 10 写入的结果不同?
【发布时间】:2020-05-13 10:27:51
【问题描述】:

打印到 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 编写时的样子(并在 OSX Mojave 的 excel 中查看) - 包含不需要的字符

这是用 High Sierra 编写的(并在 High Sierra 中以 excel 格式查看) - 包含不受欢迎的字符

何时从 Windows 10 编写并在 Windows 10 上的 excel 中查看(看起来不错!):

这是从 Mojave 编写的,但在 Windows 10 的 excel 中查看 - - 仍然包含不需要的字符

问题

我有很多上述形式的字符数据(写入 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)

【问题讨论】:

    标签: r macos encoding stringr stringi


    【解决方案1】:

    问题不是 R,问题是 Excel。

    对于平台的字符编码应该是什么,Excel 有自己的想法。值得注意的是,即使在现代 macOS 上,它也坚持认为平台编码自然是 Mac Roman。而不是实际流行的 UTF-8。

    默认情况下,文件在 macOS 上正确写入为 UTF-8。

    要让 Excel 正确读取,您需要选择“文件” › “导入...”,然后按照导入向导进行操作,该向导可让您指定文件编码。

    【讨论】:

    • 你知道如何处理 R 中的字符串,以便 excel 可以根据需要读取它吗?我已经尝试了我所知道的一切
    • @stevec 没有好的方法。您可以添加 UTF-8 BOM,但绝对每个人(包括 Microsoft!)都同意这是一种糟糕的做法。技术上最好的方法可能是使用 Excel 自动化来编写 XLSX 文件。
    • 我认为 BOM 很老派?
    • 对。 BOM 是老派,因为它是一个糟糕的解决方案。但是 Excel 的这种行为也很糟糕,可以说是一个错误。
    • @stevec 这处理变音符号以及不间断空格:iconv(stringi::stri_trans_nfkd(x), 'UTF-8', 'ASCII', sub='');这样,'ä\ua0test' 变为 'a test'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多