1. 程式人生 > >編寫R原始碼時中文編碼問題簡介

編寫R原始碼時中文編碼問題簡介

(一)中文問題的由來
各個國家的文字往往都有差別,西方主要是使用拉丁字元系列,而東方則以漢字為代表,使用象形或會意文字。由於早期的計算機在西方使用較多,所以支援的文字以拉丁語系為主,這種編碼體系在國際上有一個標準,就是ISO-8859系列,特點是僅支援拉丁語系的字元,我們國家的漢字是不在這個系列之中的。雖然ISO-8859不包含中文編碼,但它在計算機中處理的速度也是最快的,這使得很多西方人開發的軟體都採用這種編碼,這使得我們中國人在使用時就有可能會遇到中文亂碼問題。

(二)我國的漢字編碼標準
實際上,隨著計算機的普及,很多國家也都制定了和本國文字相關的一些計算機標準,我們國家的幾個標準羅列如下:、
  •   GB2312
這裡的GB代表“國標”的首字母拼音簡寫,這是我國早期制定的用於計算機中漢字處理和儲存的標準,裡面包含了6000多常用漢字的編碼規定,不過繁體和一些難檢字在這個標準裡面沒有包含進來,比如著名的前總理名字中的那個“鎔”字就沒有。
  •    GBK
是GB2312的擴充,實際上就是“國標擴”的拼音首字母縮寫。它包括了繁體和大部分難檢字,中文Windows2000、XP等都使用了這個標準做為系統文字儲存的預設編碼。
  • GB18030
這是在GBK基礎上進一步的擴充的標準,包含了中、日、韓等多國文字編碼規則(簡稱CJK編碼,CJK即Chinese、Japanese、Korean),當然也包含我國少數民族如蒙、回等文字。最新的GB18030標準在2005年釋出。
我們國家其他地區由於歷史的原因也有一些獨立的編碼體系,比如臺灣的Big5碼和香港的HK碼,他們和GB系列的不同,主要用於繁體漢字。

(三)國際編碼標準
針對不同國家的文字編碼問題,計算機界在國際上的支援主要通過Unicode系列編碼進行支援,這個編碼本身的意思就是“統一碼”。Unicode有很多變種,其中常見的就是UTF-8編碼。UTF-8編碼是很多作業系統的預設編碼,比如Uninx/Linux/Mac OSX等。中文Windows當然也支援這種編碼,但UTF-8並不是預設的編碼。

注意,上述的各種文字編碼,其實就是在儲存文字檔案時,裡面的字元用何種編碼規則進行儲存的規則。因為很多程式語言都要通過文字檔案儲存程式程式碼,所以,一但程式碼中包含了中文,就要注意對應原始檔在儲存時的編碼方式,只不過大部分程式碼編輯軟體都可以自動處理這個問題,但也有個別的原始碼編輯軟體在這方面處理不好。

(四)R中的中文問題
一般來說, 直接在R中使用中文是沒有問題的,比如變數名就可以使用中文,例如:
向量1=c(1:10);
print(向量1);
不過,在一個獨立的原始檔中編寫R程式碼,再進入R中執行時,如果程式碼中包含中文,有時就會出現問題,這和R執行的具體平臺有關。我們都知道,在R中執行一個原始檔中的程式碼時,需要使用source函式,假設該R原始檔位於R的工作目錄中,則基本的用法如下:
source("原始檔名")
source函式在執行時,其中的原始檔預設為系統預設編碼。在中文Windows系統中,如果使用記事本或者寫字板編輯程式碼,則在儲存後,其預設的編碼都是預設的GB系列,所以也一般不會出現問題。但是,如果使用RStudio,情況就不盡相同了。
RStudio是個跨平臺的軟體,它需要考慮Linux、蘋果系統Mac OSX和Windows等多個平臺的相容性問題,由於UTF-8的通用性,所以,在RStudio中新建一個R原始檔時,它預設的編碼是utf-8;而在儲存這個檔案時,RStudio預設會詢問該檔案用什麼編碼儲存,如果此時選擇了UTF-8,然後使用source命令執行,也許就會出現一些問題。為了避免這個問題,可以在source函式中指明檔案的編碼為utf-8:
souce("原始檔",echo=TRUE,encoding="utf-8")
echo這個引數是指在執行原始檔時顯示原始碼,這樣在執行時比較容易觀察結果。encoding引數就是指定原始檔儲存的編碼,此處為utf-8。
當然,直接使用RStudio,它會根據檔案的編碼,自動傳送對應的一些引數,所以一般也不會出現問題。
  在使用R語言的write系列函式產生文字檔案以便其他軟體可以使用這些資料時,也可能會出現亂碼問題。比如,R在西文Windows中,write.table、wirte.csv等函式會按照西文系統預設的編碼產生文字檔案,這使得其中包含的中文就有可能得不到正確的儲存。因此,在使用write.table等函式時,最好指定產生的文字檔案的編碼,這時只需要新增fileEncoding="中文編碼名"這個選項就可以了。比如,作業裡要求將資料框變數內容存入一個文字檔案,假設資料框變數名為df,可以使用如下程式碼:
    wirte.table(df,file="df.txt",fileEncoding="GBK")
這樣,寫入的文字檔案在任何作業系統中都不會出現中文亂碼。當然,將fileEncoding引數指定為UTF-8也可以。不過,對於中文Windows的Winword、Excel僅支援GB系列的編碼,所以,如果生成的是在Excel中應用的CSV文字檔案時,還是應採用GB2312或者GBK。同樣,為了避免read系列函式在讀出文字資料時產生亂碼,最好也要指定檔案的編碼。比如對上述df.txt檔案中的資料讀出,可以使用這樣的程式碼:
    df=read.table("df.txt",header=TRUE,check.names=FALSE,fileEncoding="GBK")

(五)結語
上述的討論,一般都是發生在不同語言環境下,或者是不同作業系統中的R版本中,在中文的Windows中一般較少出現。但瞭解這些,有助於在出了亂碼問題時,尋找解決方案的思路。