我试图理解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字符。zip
文件检测失效,并强制file()
使用raw = TRUE
。