Windows系统下R语言dir()与list.files()非英文名称编码问题
我之前处理北欧语言文件名时也碰到过完全一样的情况,这种问题基本都是Windows系统的非Unicode语言设置和R的编码适配没对齐导致的,和R版本关系不大,你怀疑系统设置的方向完全正确。
下面给你几个实测有效的解决步骤:
先检查Windows核心区域设置
这是最关键的一步:打开Windows控制面板 → 区域 → 切换到「管理」标签页,查看「非Unicode程序的语言」是不是设置为了芬兰语。R在Windows环境下默认会依赖这个设置来解析非英文文件名,而不是你当前的显示语言。如果这里是英文或者其他语言,哪怕你改了R的locale也没用。改完之后需要重启电脑生效。正确设置R的Locale参数
你之前用的Sys.setlocale(, "finnish")参数不够完整,应该明确指定类别和正确的locale名称。Windows下的locale名称格式通常是「语言_国家.代码页」,比如芬兰语对应的是Finnish_Finland.1252,试试这行代码:# 针对文件排序/文件名解析的类别单独设置 Sys.setlocale(category = "LC_COLLATE", locale = "Finnish_Finland.1252") # 或者一次性设置所有locale类别 Sys.setlocale(category = "LC_ALL", locale = "Finnish_Finland.1252")如果这个名称不行,可以试试
fi_FI.UTF-8,不同Windows版本可能略有差异。直接给list.files()指定编码
如果你不想修改全局locale,可以在调用函数时直接指定编码参数,强制R用对应编码解析文件名:# 用UTF-8编码读取 list.files(path = ".", encoding = "UTF-8") # 或者用Windows西欧编码(适合芬兰语) list.files(path = ".", encoding = "Windows-1252")让设置永久生效
要是不想每次启动R都手动设置,可以在你的.Rprofile文件里添加一段自动判断系统并设置locale的代码:if (.Platform$OS.type == "windows") { Sys.setlocale(category = "LC_ALL", locale = "Finnish_Finland.1252") }这个文件一般在你的用户目录下(比如
C:\Users\你的用户名\.Rprofile),如果没有就新建一个。
至于为什么有的同版本R机器能正常显示,就是因为那些机器的「非Unicode程序的语言」已经提前设置成了芬兰语,R默认就能适配编码,所以不需要额外操作。
内容的提问来源于stack exchange,提问作者R. Iv

