介紹如何在 R 中讀取、處理與輸出 UTF-8 萬國碼的資料,解決編碼錯誤或亂碼問題。
這裡我們以政府資料開放平台的空氣品質監測資料來示範如何使用 R 來處理含有 UTF-8 編碼的資料。
若以 read.csv
函數直接讀取 UTF-8 編碼的 CSV 檔案,會出現類似以下這種錯誤:
# 讀取 CSV 檔案 df <- read.csv("aqx_p_15_20210327100101.csv")
Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec, : 無效的多位元組字串於 '<e8><87><ad>瘞<a7>'
接著可以嘗試以 UTF-8
編碼的方式載入檔案:
# 讀取 CSV 檔案(UTF-8 編碼) df <- read.csv("aqx_p_15_20210327100101.csv", fileEncoding = "UTF-8")
Error in read.table(file = file, header = header, sep = sep, quote = quote, : no lines available in input 此外: Warning message: In read.table(file = file, header = header, sep = sep, quote = quote, : 輸入連結 'aqx_p_15_20210327100101.csv' 中的輸入不正確
如果還是出現錯誤,可以再嘗試 UTF-8-BOM
編碼:
# 讀取 CSV 檔案(UTF-8-BOM 編碼) df <- read.csv("aqx_p_15_20210327100101.csv", fileEncoding = "UTF-8-BOM")
通常在讀取 UTF-8 編碼的資料時,常見的編碼大概就是 UTF-8
與 UTF-8-BOM
,只要載入資料時沒有顯示錯誤訊息,大概就沒什麼問題。
在 R 中若直接出含有 UTF-8 的資料,會很難辨識實際的內容:
# 顯示 df$ItemName 前 6 筆資料 head(df$ItemName)
[1] "\u81ed\u6c27" "\u4e8c\u6c27\u5316\u6c2e" [3] "\u975e\u7532\u70f7\u78b3\u6c2b\u5316\u5408\u7269" "\u4e00\u6c27\u5316\u78b3" [5] "\u98a8\u5411" "\u4e00\u6c27\u5316\u6c2e"
這種狀況可以使用 utf8
套件的 utf8_print
函數來以 UTF-8 編碼的方式輸出:
# 引入 utf8 套件 library(utf8) # 顯示 df$ItemName 前 6 筆資料(以 UTF-8 編碼輸出) utf8_print(head(df$ItemName))
[1] "臭氧" "二氧化氮" "非甲烷碳氫化合物" "一氧化碳" "風向" [6] "一氧化氮"
若資料沒有對應正確的編碼,會造成資料完全無法使用,utf8_valid
函數可用來檢查 UTF-8 編碼的資料是否可以正常轉換為 UTF-8 字串:
# 檢查 UTF-8 編碼資料是否正確 utf8_valid(head(df$ItemName))
[1] TRUE TRUE TRUE TRUE TRUE TRUE
若經過 utf8_valid
驗證的結果為 FALSE
,就代表資料本身有損毀,或是編碼錯誤。
若要轉換編碼,可以使用 iconv
函數:
# 原始 UTF-8 資料 text <- head(df$ItemName) # 將 UTF-8 編碼轉為 Big5 text.big5 <- iconv(text, "UTF-8", "Big5")
iconvlist
函數可以列出所有 iconv
支援的編碼:
# 列出支援的編碼 iconvlist()
若需要將資料以原始的位元組(bytes)方式輸出,可以使用 charToRaw
函數:
# 以位元組(bytes)方式表示 charToRaw(df$ItemName[16])
[1] e9 9b a8 e9 87 8f
若要將含有 UTF-8 編碼的資料輸出成 CSV 檔案,可以在呼叫 write.csv
的時候,以 fileEncoding
參數將檔案編碼指定為 UTF-8
:
# 輸出 UTF-8 編碼的 CSV 檔案 write.csv(df, "output.csv", fileEncoding = "UTF-8")
Excel 若直接開啟 UTF-8 編碼的 CSV 檔案會呈現亂碼,解決方式可參考 Excel 匯入 UTF-8 編碼 CSV 檔案的教學。
若後續需要以 Excel 處理,也可以直接將資料以 Big5
編碼來輸出,這樣就可以讓 Excel 直接開啟:
# 輸出 Big5 編碼的 CSV 檔案 write.csv(df, "output.csv", fileEncoding = "Big5")
參考資料:RWEPA blog