如何解决R语言调用cmd系统命令时出现的西里尔符号乱码问题?
解决R调用tasklist返回西里尔字符乱码问题
以下是经过验证的可行解决方案,按优先级依次尝试即可:
- 方案1:强制cmd切换为UTF-8编码后执行tasklist
调用时指定cmd先执行编码切换命令,屏蔽切换日志后再运行tasklist,代码如下:
该方案无需额外转码步骤,直接返回UTF-8编码的正常结果,适配绝大多数Windows环境。test <- system2(command = "cmd", args = c("/c", "chcp 65001 >nul & tasklist"), stdout = TRUE, stderr = TRUE, wait = TRUE) - 方案2:手动指定编码转码
若此前iconv无效,大概率是未指定正确的源编码,西里尔字符的Windows默认编码为CP1251,按如下方式转码即可:# 先执行原代码拿到乱码结果 test <- system2(command="tasklist", stdout=TRUE, stderr=TRUE, wait = TRUE) # 按CP1251源编码转UTF-8 test_fixed <- iconv(test, from = "CP1251", to = "UTF-8") - 方案3:使用shell函数替代system2
Windows下shell函数对系统编码的适配性优于system2,可直接指定编码参数读取:test <- shell("tasklist", intern = TRUE, encoding = "CP1251") - 方案4:临时修改R区域设置
运行任务前先设置R的字符类型区域为西里尔对应编码:Sys.setlocale("LC_CTYPE", "Russian_Russia.1251") # 再执行原命令即可正常返回结果 test <- system2(command="tasklist", stdout=TRUE, stderr=TRUE, wait = TRUE)
内容的提问来源于stack exchange,提问作者manro
相关产品推荐
相关产品推荐

