Categories: R

R 讀取、處理、輸出 UTF-8 萬國碼資料教學與範例

介紹如何在 R 中讀取、處理與輸出 UTF-8 萬國碼的資料,解決編碼錯誤或亂碼問題。

這裡我們以政府資料開放平台的空氣品質監測資料來示範如何使用 R 來處理含有 UTF-8 編碼的資料。

讀取 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-8UTF-8-BOM,只要載入資料時沒有顯示錯誤訊息,大概就沒什麼問題。

處理 UTF-8 編碼資料

在 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 編碼資料

若要將含有 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 檔案的教學

輸出 Big5 編碼資料

若後續需要以 Excel 處理,也可以直接將資料以 Big5 編碼來輸出,這樣就可以讓 Excel 直接開啟:

# 輸出 Big5 編碼的 CSV 檔案
write.csv(df, "output.csv", fileEncoding = "Big5")

參考資料:RWEPA blog

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

10 個月 ago