Windows下R的fs::dir_ls()无法正确处理文件名中的非ASCII字符
解决思路与操作步骤
1. 针对性调整R的字符编码区域
当前系统区域为Greek_Greece.1253(单字节编码,不支持ü这类西欧字符),无需修改全部区域设置,仅调整负责字符处理的LC_CTYPE:
- 执行命令:
Sys.setlocale("LC_CTYPE", "German_Germany.1252") - 验证设置:
Sys.getlocale("LC_CTYPE")返回"German_Germany.1252"即生效 - 重新测试
fs::dir_ls(my_dir)和fs::file_exists()
2. 强制fs包使用Windows宽字符API
绕开系统编码限制,直接读取文件名的Unicode原始值:
- 设置环境变量并重载fs包:
Sys.setenv(FST_USE_WINDOWS_WIDE_CHAR=1) detach("package:fs", unload=TRUE) library(fs) - 若重启R会话后失效,可将环境变量设置写入
.Renviron文件(usethis::edit_r_environ())实现永久生效
3. 调整Windows系统区域设置(永久方案)
若临时调整R编码有效,可修改系统层面的区域配置:
- 打开控制面板 > 时钟和区域 > 区域 > 管理,点击「更改系统区域设置」
- 选项1:勾选「Beta版:使用Unicode UTF-8提供全球语言支持」(注意:可能影响部分老软件兼容性)
- 选项2:选择「德语(德国)」作为系统区域,原生支持西欧字符
- 重启电脑后再测试R中的fs函数
4. 调整fs包版本
若问题是fs包更新引入的兼容性问题,可回退至之前正常工作的版本:
- 找到CRAN上fs包的归档版本,下载适配R3.6.2的旧版本源码包
- 执行本地安装命令:
install.packages("本地文件路径/fs_x.x.x.tar.gz", repos=NULL, type="source")
内容的提问来源于stack exchange,提问作者GerasimosPanagiotakopoulos
相关产品推荐
相关产品推荐

