如何在R中读取含正确与错误重音字符的下载.csv文件?
解决CSV混合编码导致的重音字符显示错误问题
这种情况属于混合编码污染:文件里同时存在两种编码的字符——一部分是标准UTF-8编码(比如正常的"Veríssimo"),另一部分是UTF-8字符被错误以ISO-8859-1(Latin-1)解码后写入的结果(比如"VirgÃ-nia"实际对应正确的"Virgínia")。以下是两种针对性的R语言解决方案:
方案1:优先保留UTF-8正确字符,修复错误转码的字符
如果文件中大部分正确字符是UTF-8格式,用这个方法:
library(readr) library(stringi) library(dplyr) # 第一步:以UTF-8编码读取整个文件 dados_MG <- read_csv("dados_MG.csv", locale = locale(encoding = "UTF-8")) # 定义修复函数:把错误显示的字符串转成字节,再用UTF-8重新解码 fix_wrong_encoding <- function(text) { if (is.character(text)) { stri_encode(stri_enc_toutf8(text, is_unknown = "passthrough"), from = "ISO-8859-1", to = "UTF-8") } else { text } } # 对所有字符列应用修复 dados_MG_fixed <- dados_MG %>% mutate(across(where(is.character), fix_wrong_encoding))
方案2:优先保留ISO-8859-1正确字符,修复UTF-8乱码
如果文件中大部分正确字符是ISO-8859-1格式,用这个方法:
library(readr) library(stringi) library(dplyr) # 第一步:以ISO-8859-1编码读取整个文件 dados_MG <- read_csv("dados_MG.csv", locale = locale(encoding = "ISO-8859-1")) # 定义修复函数:把UTF-8乱码的字符串转成字节,再用ISO-8859-1重新解码 fix_utf8_garbage <- function(text) { if (is.character(text)) { stri_encode(stri_enc_toutf8(text, is_unknown = "passthrough"), from = "UTF-8", to = "ISO-8859-1") } else { text } } # 对所有字符列应用修复 dados_MG_fixed <- dados_MG %>% mutate(across(where(is.character), fix_utf8_garbage))
补充说明
- 如果只有个别列出现编码问题,可以把
across(where(is.character))替换成具体列名(比如across(c(nome_coluna1, nome_coluna2))),避免影响其他正确的字符。 - 可以先预览几行数据,判断哪种编码的正确字符更多,再选择对应的方案。
内容的提问来源于stack exchange,提问作者Monelisa
相关产品推荐
相关产品推荐

