[英]How to save non-English characters in text file in R?
在 Windows 文章的 R 中作為 UTF-8 編碼找到了一種解決方法(其中有詳盡的解釋):
BOM <- charToRaw('\xEF\xBB\xBF')
writeUtf8 <- function(x, file, bom=F) {
Encoding(x) <- "UTF-8" # superabundant?
con <- file(file, "wb")
if(bom) writeBin(BOM, con, endian="little")
writeBin(charToRaw(x), con, endian="little")
close(con)
}
data <- c("चौपाई")
writeUtf8(x=data, file="data.txt")
解釋(從上述文章中復制和粘貼,部分截斷):
Windows與其他操作系統的區別
我想說盡可能簡單。 Windows 選擇多種語言集之一,然而,Linux 和 Mac OS 選擇 UTF-8 集的一種語言子集。 通過這種差異,Windows 會忘記未選擇語言的字符,而其他操作系統會記住所有語言的字符。
Windows 上的問題
將文本寫入文件時,無法處理未選擇區域設置語言的字符。 其中一些被轉換為類似(但不正確)的字符。 其他的則寫為轉義格式,例如 <U+222D>。
請注意,R 不對這個問題負責。 因為操作系統的切換語言架構正在產生問題。
…當 R 將 UTF-8 文本寫入 Windows 上的文件時,不支持語言的字符會被修改。 相反,所有字符在 Mac OS 中都正確寫入。
使用二進制
這個問題有一個解決方案。 編寫二進制文件而不是文本文件可以解決這個問題。 在 Windows 中處理 UTF-8 文件的所有應用程序都使用相同的技巧。
物料清單
BOM 不應在 UTF-8 文件中使用。 這就是 Linux 和 Mac OS 正在做的事情。 但是 Windows 記事本和一些應用程序使用 BOM。 因此,盡管語法錯誤,仍需要處理 BOM。
BOM 是放在文本文件開頭的 3 字節字符,但由於 R 不使用 BOM,因此應在讀取時將其刪除。
BOM <- charToRaw('\xEF\xBB\xBF')
寫入 UTF-8 文件
writeUtf8 <- function(x, file, bom=F) { con <- file(file, "wb") if(bom) writeBin(BOM, con, endian="little") writeBin(charToRaw(x), con, endian="little") close(con) }
將 UTF-8 字符串指定為 x=,將要寫入的文件名指定為 file=。 如果您只想使用 Windows 記事本讀取文件,通過
bom=T
選項添加 BOM 是一個不錯的選擇。 請注意,這是一個最小腳本,並不意味着要編寫一個非常大的文件。
請注意添加到readUtf8
和readUtf8Text
函數中的編碼內容( Encoding(result) <- "UTF-8"
):
讀取 UTF-8 很容易,因為像 readLines 這樣的函數有 encoding= 選項,可以接受 UTF-8。
readUtf8Text <- function(file) {
con <- file(file, 'rt')
result <- readLines(con, encoding='utf-8')
close(con)
Encoding(result) <- "UTF-8" # important
result
}
如果您想閱讀由 Windows 標准應用程序(如記事本)保存的 UTF-8 文件,您可能會遇到麻煩。 由於 Windows 記事本在寫入 UTF-8 文件時會附加 BOM,因此您必須刪除 R 上的 BOM。 否則 BOM 將在字符串的開頭顯示為損壞的字符。
現在,R 3.0.0 支持 UTF-8-BOM 編碼以去除 BOM。 但是,如果您想暫時使用 R 2.15.3,則必須手動刪除 BOM。 以下代碼將 UTF-8 文件讀取為二進制文件並刪除 BOM。
請注意,這是一個最小的腳本,並不意味着讀取一個非常大的文件。
readUtf8 <- function(file) {
size <- file.info(file)$size
con <- file(file, "rb")
x <- readBin(con, raw(), size, endian="little")
close(con)
pstart <- ifelse(all(x[1:3]==BOM), 4, 1)
pend <- length(x)
result <- rawToChar(x[pstart:pend])
Encoding(result) <- "UTF-8" # important
result
}
在RStudio
1.3 和RGui
4.0.1 中測試( Windows 10/64bit, ie platform
x86_64-w64-mingw32`):
> data <- c("चौपाई")
> writeUtf8(x=data, file="data.txt")
>
> data
[1] "चौपाई"
>
> readUtf8Text(file="data.txt")
[1] "चौपाई"
>
> readUtf8(file="data.txt")
[1] "चौपाई"
為了證明Encoding(result) <- "UTF-8"
在兩個讀取函數中防止mojibake的重要性:
> file <- "data.txt"
> con <- file(file, 'rt')
> result <- readLines(con, encoding='utf-8')
> close(con)
> result # mojibake
[1] "चौपाई"
> Encoding(result) <- "UTF-8"
> result
[1] "चौपाई"
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.