R4.2读取含Umlaut变音符号名的文件夹编码异常如何解决
问题概述
- 场景限制:他人创建了名称包含Umlaut变音符号的文件夹,无修改文件夹名称权限,需读取文件夹内全部文件
- 异常表现:已配置环境使用UTF-8编码,R 4.2版本仍无法正常识别带变音符号的路径,字符输出为Unicode转义格式
- 最小复现代码:
c("sähköpyörä") #> [1] "s<U+00E4>hk<U+00F6>py<U+00F6>r<U+00E4>"
注:上述复现示例由reprex包(v2.0.1)于2022-06-08创建。
可落地解决方案
方案1:直接从上级目录读取结果索引目标路径(无成本优先尝试)
不要手动硬编码输入带变音符号的路径字符串,先读取目标文件夹上级目录的完整文件列表,从返回结果中索引到目标文件夹的路径对象即可。这种方式获取的路径字符串由操作系统直接返回,编码完全匹配系统要求,不存在手动输入的编码不匹配问题。示例代码:# 替换为目标文件夹的上级目录路径 parent_files <- list.files("path/to/parent_dir", full.names = TRUE) # 匹配目标文件夹名,获取可正常识别的路径 target_dir <- parent_files[grep("pyörä", parent_files)] # 直接读取目标文件夹内文件 list.files(target_dir)方案2:Windows环境使用系统短路径规避特殊字符
Windows系统默认会为含非ASCII字符的文件/文件夹生成8.3格式的短路径名,完全不含特殊变音符号,可直接被R识别。操作方式:打开命令提示符,进入目标文件夹的上级目录,执行dir /x命令,即可在输出中看到对应带变音符号文件夹的短路径名(格式类似SAHKOP~1),直接使用该短路径传入R的文件操作函数即可。方案3:手动转换路径为系统原生编码
R 4.2在Windows平台的默认UTF-8支持存在兼容缺陷,手动输入的UTF-8编码路径字符串不会被自动转码,可使用enc2native()函数将路径转换为系统原生编码后再使用,示例:target_path <- enc2native("sähköpyörä") list.files(target_path)方案4:替换为编码兼容性更好的文件操作工具
基础R的文件操作函数对多字节字符路径兼容较差,可使用fs包提供的文件系统函数替代基础R的list.files()、file.exists()等函数,fs包底层做了跨平台的编码自动转换,不需要手动调整编码配置即可正常识别带Umlaut变音符号的路径。方案5:调整R启动编码配置
找到R安装目录下的Rprofile.site配置文件,在文件末尾添加如下配置,强制R启动时加载UTF-8区域设置:Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8")也可以在启动R时附加启动参数
R --encoding=UTF-8,或在RGui设置中将默认输入、输出编码均指定为UTF-8后重启会话。
内容的提问来源于stack exchange,提问作者glhrm

