如果文件名包含unicode字符,file()会产生不同的输出吗?

时间:2017-08-07 09:05:46

标签: r unicode zip filenames

我试图理解R file()函数行为的不一致性。

示例:

# openssl for producing hash values
require(openssl)

# sample data
data(mtcars)
saveRDS(mtcars, './mtcars.rds')
saveRDS(mtcars, './mtcars测试.rds')

# if file name is ascii, file() produces different outputs
# for raw = FALSE/TRUE
sha2(file('./mtcars.rds', raw = FALSE), size = 256L)
sha2(file('./mtcars.rds', raw = TRUE), size = 256L)

# if file name contains unicode characters,
# the output stays the same regardless of raw = FALSE/TRUE
sha2(file('./mtcars测试.rds', raw = FALSE), size = 256L)
sha2(file('./mtcars测试.rds', raw = TRUE), size = 256L)

# But text files are not affected
writeLines(text = 'openssl, mtcars, 天地玄黄', con = './mtcars.txt')
writeLines(text = 'openssl, mtcars, 天地玄黄', con = './mtcars测试.txt')

sha2(file('./mtcars.txt', raw = FALSE), size = 256L)
sha2(file('./mtcars.txt', raw = TRUE), size = 256L)

sha2(file('./mtcars测试.txt', raw = FALSE), size = 256L)
sha2(file('./mtcars测试.txt', raw = TRUE), size = 256L)

我在Windows(R 3.3.3 x64)和CentOS(R 3.4.0 x64)上测试了上述内容,openssl版本为0.9.6。

我的问题是,为什么会发生这种情况?

到目前为止我最好的猜测:

    如果给出file()文件,
  • zip会使用特殊方法。 (我知道RDS是一个R对象gzip到磁盘。)
  • R的某些低级功能仍然不喜欢文件名中的Unicode字符。
  • 包含Unicode字符的文件名会使zip文件检测失效,并强制file()使用raw = TRUE

0 个答案:

没有答案