如何使用UTF-8编码保存source().R文件?

Ton*_*yal 39 file-io encoding r utf-8 internationalization

以下,当直接复制并粘贴到R中时可以正常工作:

> character_test <- function() print("R??????GNU S????????????????????????????????????...")
> character_test()
[1] "R??????GNU S??????????????,???????,?????????????..."
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建一个名为character_test.R的文件,其中包含EXACT SAME代码,请将其保存为UTF-8编码(以便保留特殊的中文字符),然后当我在R中使用source()时,我收到以下错误:

> source(file="C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8")
Error in source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "utf-8") : 
  C:\Users\Tony\Desktop\character_test.R:3:0: unexpected end of input
1: character.test <- function() print("R
2: 
  ^
In addition: Warning message:
In source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8") :
  invalid input found on input connection 'C:\Users\Tony\Desktop\character_test.R'
Run Code Online (Sandbox Code Playgroud)

您可以提供任何帮助以解决并帮助我理解这里发生的事情,我将不胜感激.

> sessionInfo() # Windows 7 Pro x64
R version 2.12.1 (2010-12-16)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] tools_2.12.1
Run Code Online (Sandbox Code Playgroud)

> l10n_info()
$MBCS
[1] FALSE

$`UTF-8`
[1] FALSE

$`Latin-1`
[1] TRUE

$codepage
[1] 1252
Run Code Online (Sandbox Code Playgroud)

Ber*_*ann 26

我们在上一篇文章的评论中对此进行了大量讨论,但我不希望在评论的第3页上丢失这些内容:您必须设置语言环境,它适用于来自R-console的两个输入(请参阅评论)以及来自文件的输入请看这个截图:

文件"myfile.r"包含:

russian <- function() print ("???????????? ?...");
Run Code Online (Sandbox Code Playgroud)

控制台包含:

source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "???????????? ?..."
Run Code Online (Sandbox Code Playgroud)

请注意,文件输入失败并且它指向与原始海报错误相同的字符("R"之后的那个.我不能用中文这样做因为我必须安装"Microsoft Pinyin IME 3.0",但是这个过程是一样的,你只需用"chinese"替换语言环境(命名有点不一致,请查阅文档).

  • @Tony里普利教授正在谈论他的帽子!Windows支持UTF-8就好了.自1991年以来,Windows一直支持Unicode,而且它在Linux上使用UTF-16而不是UTF-8的原因是它在UTF-8被发明之前就支持Unicode了!我的Windows应用程序在早餐时吃掉所有这些字符.指定编码时,区域设置应无关紧要.我在这里指责`iconv`是罪魁祸首,但我担心如果Ripley教授采取这种态度,那么Windows上的R几乎没有希望能够正确地支持Unicode. (6认同)

Joe*_*eng 26

在R/Windows上,source遇到任何无法在当前语言环境(或Windows语言中的ANSI代码页)中表示的UTF-8字符的问题.不幸的是,Windows没有UTF-8作为ANSI代码页 - Windows有一个技术限制,ANSI代码页只能是每字符一个或两个字节的编码,而不是像UTF-那样的可变字节编码8.

这似乎不是一个基本的,无法解决的问题 - 这个source功能只是出了点问题.通过这样做,您可以获得90%的方式:

eval(parse(filename, encoding="UTF-8"))
Run Code Online (Sandbox Code Playgroud)

这个工作几乎source()与默认参数一样,但不会让你做echo = T,eval.print = T等.

  • `source`将`encoding`参数转发给`file`,后者又将内存中的文本输入转换为指定的任何语言环境编码(并且失败) - 这似乎是罪魁祸首.相比之下,`parse`不会这样做,它按原样读取文件,只是用正确的编码标记内存中的字节. - 我不完全确定这告诉我们什么,除了R的内部处理编码是凌乱的(我们已经知道),并且应该修复,向后兼容性被诅咒. (6认同)

Dav*_*nan 5

我认为问题出在R上。我可以愉快地获取UTF-8文件或包含许多非ASCII字符的UCS-2LE文件。但是某些字符会导致失败。例如以下

danish <- function() print("Skønt H. C. Andersens barndomsomgivelser var meget fattige, blev de i hans rige fantasi solbeskinnede.")
croatian <- function() print("Dodigovi?. Kako se Vi zovete?")
new_testament <- function() print("Ne provizu al vi trezorojn sur la tero, kie tineo kaj rusto konsumas, kaj jie ?telistoj trafosas kaj ?telas; sed provizu al vi trezoron en la ?ielo")
russian <- function() print ("???????????? ???? ????????? ? ????????????? ?????. ?????? ???????? ????????? ???????????? ?????????? ??????????.")
Run Code Online (Sandbox Code Playgroud)

在没有俄文线的情况下,在UTF-8和UCS-2LE中都可以使用。但是,如果包括在内,那么它将失败。我的手指指向R。对于Windows上的R,您的中文文本似乎也太难了。

这里的语言环境似乎无关紧要。它只是一个文件,您告诉它文件编码是什么,为什么您的语言环境很重要?


cro*_*384 5

对我(在窗户上)我这样做:

source.utf8 <- function(f) {
    l <- readLines(f, encoding="UTF-8")
    eval(parse(text=l),envir=.GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.