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"))

 

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