簡體   English   中英

如何在 R 的文本文件中保存非英文字符?

[英]How to save non-English characters in text file in R?

我正在嘗試將一些印地語文本保存到 R 中的文本文件中。

data <- c("चौपाई")
write(data, "data.txt")

output 文件 data.txt 打開時顯示 Unicode 字符為 -

<U+091A><U+094C><U+092A><U+093E><U+0908>

而不是印地語文字चौपाई

我在這里做錯了什么?

Rstudio截圖

在此處輸入圖像描述

在 Windows 記事本中打開data.txt時的屏幕截圖

在此處輸入圖像描述

Notepad +++中打開data.txt時的屏幕截圖

在此處輸入圖像描述

在 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 是一個不錯的選擇。 請注意,這是一個最小腳本,並不意味着要編寫一個非常大的文件。

編輯

請注意添加到readUtf8readUtf8Text函數中的編碼內容( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM