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

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

> character_test <- function() print("R同时也被称为GNU S是一个强烈的function性语言和环境,探索统计数据集,使许多从自定义数据graphics显示...") > character_test() [1] "R同时也被称为GNU S是一个强烈的function性语言和环境,探索统计数据集,使许多从自定义数据graphics显示..." 

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

 > 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' 

任何帮助你可以提供解决和帮助我理解这里发生的事情将不胜感激。

 > 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 

 > l10n_info() $MBCS [1] FALSE $`UTF-8` [1] FALSE $`Latin-1` [1] TRUE $codepage [1] 1252 

我们在之前的文章的评论中对此进行了很多讨论,但我不希望在第3页的评论中迷失方向:您必须设置语言环境,它可以同时处理来自R控制台的input(参见截图评论)以及从文件input看这个屏幕截图:

文件“myfile.r”包含:

 russian <- function() print ("Американские с..."); 

该控制台包含:

 source("myfile.r", encoding="utf-8") > Error in source("..... Sys.setlocale("LC_CTYPE","ru") > [1] "Russian_Russia.1251" russian() [1] "Американские с..." 

请注意,文件input失败,它指向与原来的海报错误(“R”之后的那个相同的字符。我不能用中文做这个,因为我将不得不安装“微软拼音input法3.0”,但进程是一样的,你只需用“chinese”来代替locale(命名有点不一致,请参考文档)。

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

这似乎不是一个根本性的,无法解决的问题 – source函数只是出了问题。 你可以用90%的方法来代替:

 eval(parse(filename, encoding="UTF-8")) 

这将工作几乎完全像默认参数的source() ,但不会让你做echo = T,eval.print = T等

我认为问题在于R.我可以愉快地获取UTF-8文件或UCS-2LE文件,其中包含许多非ASCII字符。但有些字符会导致失败。 例如以下

 danish <- function() print("Skønt HC 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 ("Американские суда находятся в международных водах. Япония выразила серьезное беспокойство советскими действиями.") 

在没有俄罗斯线的情况下UTF-8和UCS-2LE都可以。 但是,如果包括那么它失败了。 我把手指指向R.你的中文文字在Windows上似乎也太难了。

区域设置在这里似乎不相关。 这只是一个文件,你告诉它什么编码文件,为什么你的语言环境很重要?

对我来说(在Windows上)我是这样做的:

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

它工作正常。

在Windows上,当将Unicode或UTF-8编码的string复制粘贴到设置为单字节input(ascii …取决于语言环境)的文本控件中时,未知字节将被replace为问号标记。 如果我把你的string的前4个字符,并复制粘贴到例如记事本,然后保存它,文件变成hex:

52 3F 3F 3F 3F

你需要做的是find一个你可以设置为utf-8的编辑器,然后将保存的文件(你的前4个字符)复制到它里面:

52 E5 90 8C E6 97 B6 E4 B9 9F E8 A2 AB

这将被[R]认定为有效的utf-8。

我用“记事本2”来尝试这个,但我相信还有更多。

当我试图find包含一些中文字符的.R文件时遇到这个问题。 就我而言,我发现仅仅把“LC_CTYPE”设置为“中文”是不够的。 但是将“LC_ALL”设置为“中文”效果很好。

请注意,在使用非ASCII的Rstudio(或R?)中读取或写入纯文本文件时,正确编码是不够的。 语言环境设置也计数。

PS。 命令是Sys.setlocale(category =“LC_CTYPE”,locale =“chinese”)。 请相应地replace区域值。