如何使用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区域值。