R语言修改CSV列名时出现Â字符乱码的问题及解决方法
乱码原因&解决办法
为啥会出现Â这种乱码?
T2 [°C]是编码不兼容搞出来的问题:
°在UTF-8编码里是占2个字节的字符,如果读取或保存文件时编码不统一(比如原文件是单字节的Latin-1编码,却用UTF-8读取;或者修改列名后用非UTF-8编码保存),这个多字节字符会被拆成单个字节错误解析,Â就是拆分后错读出来的结果。- 原文件列名里的
?本身也是编码错误的产物:原文件中的°因为编码不匹配,被读取成了无效字符?,后续修改列名时又叠加了编码转换错误,最终就出现了带Â的乱码。
怎么改成正确的T2 [°C]?
1. 读取文件时指定正确编码
原文件的编码大概率不是UTF-8,在fread里加上对应编码参数(先试试Latin-1,不行再换UTF-8),确保原列名被正确解析:
read_the_files <- function(filelist){ lapply(filelist, function(file) { # 先尝试用Latin-1编码读取,不对就换成UTF-8 fread(file, skip = "Date/Time XY [XY]", encoding = "Latin-1") }) }
2. 修改列名时保证编码统一
如果读取后列名还是T2 [?C],直接匹配这个列名,同时把新列名转成UTF-8编码再替换:
adj_col_nam <- function(dt_list){ lapply(dt_list, FUN = function(x){ # 把新列名转成UTF-8编码,避免转换错误 new_col_name <- enc2utf8("T2 [°C]") setnames(x, old = "T2 [?C]", new = new_col_name, skip_absent = TRUE) return(x) }) }
3. 保存文件时强制用UTF-8编码
处理完的数据保存时,一定要指定UTF-8编码,防止再次出现乱码:
# 示例:将处理好的文件逐个保存为新文件 processed_data <- adj_col_nam(read_the_files(dirlist)) lapply(seq_along(processed_data), function(i){ fwrite(processed_data[[i]], file = paste0("processed_", dirlist[i]), encoding = "UTF-8") })
额外小技巧:先确认原文件编码
不确定原文件编码的话,可以先读取几行查看编码类型:
# 读取第一个文件的前5行,查看编码 first_few_lines <- readLines(dirlist[1], n = 5) Encoding(first_few_lines)
根据输出的编码类型,调整fread里的encoding参数即可。
内容的提问来源于stack exchange,提问作者Alexia k Boston
相关产品推荐
相关产品推荐

