R语言函数中的字符编码解析

一.RStudio编码设置

Rstudio有时出现读取乱码,在电脑本地打开又是正常的。这是因为Rstudio的编码显示问题,可以通过软件设置来解决。但有时可能会因为Rstudio的版本不同,编码设置的路径也会有所不同

常见中文格式编码主要有两种:GBK(GB2312)和UTF-8

读取数据read.csv()或者read.table(),WINDOWS如果不指定文件格式编码默认读取的文件格式是GBK,也有少数gb18030或utf-8。Rstudio可以设置默认的中文编码格式,但实际效果是设置前后是一样的(default text encoding)网页编码绝大多数是utf-8,mysql数据库编码大多数是utf8

二.read.csv()读取数据

LINUX环境下系统指定中文编码格式是utf_8,故read.csv()或read.table()都要求文本类型为utf_8。windows环境下用read.csv()读取时,utf_8格式乱码,如果用encoding指定文件的中文编码时则不会乱

read.csv("路径\文件名",encoding="utf_8")
#fileEncoding:在声明文件上使用的编码(即重新编码字符数据)
	encoding:不用于重新编码输入,只是标记字符串为已知编码,允许R以本机编码处理编码字符串
注:读取文件时,也读取了字符编码集

当读取csv文件数据量过大时,提示"reached getOption("max.pr-

int")--omitted 50071 rows"。是因为R控制台显示行数要求已经不能满足csv文件数据量,如果想全部显示,添加命令如下:

options(max.print=<数值)

三.read.table()读取数据

读取GBK数据时

read.table("路径文件名",sep=",")

读取utf_8格式时

read.table("路径文件名",sep=",",fileEncoding="UTF_8")
read.table("路径文件名",sep=",",encoding="UTF_8")

read.table()比较read.csv()更加严格,要求行都有相同的长度,读取遇到空值时,不会自动填充NA

四.write.csv()写入数据指定编码方式

write.csv(text,"路径文件名",fileEncoding="GBK")
write.csv(text,"路径文件名",fileEncoding="UTF_8")

read.csv()/read.table()尽量读入文件GBK格式(Win下)或者UTF-8格式(Linux下)不是的话,用fileEncoding指定编码格式,不要用encoding

五.read.csv()读取文件时出错

错误一般是make.name(col.names,unique=TURE)多字节字符串有错。在该种情况下,如果将header行删除后读取就是正常读入的,但如果保留header会报错

此时的问题一般是编码+TAB分隔符,因为文件是假的csv格式文件。此时可以将原来假csv文件重新另存为csv格式文件。或者采取另一种方法:使用分隔参数sep=“\t”,另外在编码处采用fileEncoding=“ULS-2LE”

六.RODBC连接MySql中文读取出现乱码

当已经把数据库编码设置为utf-8或者其他中文编码格式时,R语言中文读取出现乱码,有几个解决方法

ODBC-Mysql的中文格式配置如下,设置为UTF-8(在配置ODBC的时候,要选择ANSI,不要选择unicode)

#设置DBMSending为utf-8

myconn<-odbcConnect(dsn=dsn,uid=uid,pwd=pwd,DBMSencoding="UTF8") 

七.编码处理函数

#R语言环境
iconvlist()	#用于输出不同环境支持的编码类型
sessionInfo()	#默认使用系统字符集(cp936即gb2312编码)
locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936 
[2] LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936
[4] LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936

#在R中设定 Locale
Sys.setlocale("LC_ALL","Chinese")

#字符编码转换,字符编码即编码字符集和实际存储数值之间的转换关系.字符集规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系.R语言提供的一些字符编码函数
#Encoding函数用于读取和设置字符向量编码.R字符串可使用包括"latin1" ,"UTF-8"或"bytes"编码格式.由于ASCII字符串对各种编码表示的形式相同,故Encoding获取的编码方式为unknown
x<-"fa\xE7ile"	
Encoding(x)	#字符编码为unknown
Encoding(x) <-"latin1"	#设置字符编码为latin1

enc2native(x)	#将字符向量的元素转换为本机编码(考虑任何标记的编码)
enc2utf8(x)	#将字符向量的元素转换为UTF-8(考虑任何标记的编码)

#iconv函数,字符编码转换(转换过程并不会做太多的校验)因此放源编码不合法时,常常不能正确转换,基本语法:
iconv(x, from ="", to = "", sub = NA, mark = TRUE, toRaw = FALSE)
from源编码,to目标编码.sub用于替换不能转换的字节(默认为NA)如果本身为字节类型,则使用16进制字节形式替换.mark逻辑值,指明返回的字符向量是否申明编码类型,默认为TRUE.toRaw逻辑值,指明返回字符向量还是字节向量
x<-"fa\xE7ile"
#设置字符编码为latin1
Encoding(x)<-"latin1"
#转换latin1字符编码为UTF-8
iconv(x, "latin1","UTF-8")
#转换为字节型输出
iconv(x, "latin1","UTF-8", toRaw = T)
charToRaw(iconv(x,"latin1", "UTF-8"))

#从当前语言环境选择合适的编码名称
localeToCharset(locale =Sys.getlocale("LC_CTYPE"))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章