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

问题描述 投票:37回答:7

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

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

但是,如果我创建一个名为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'

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

> 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
r file-io encoding utf-8 internationalization
7个回答
23
投票

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

文件“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] "Американские с..."

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


26
投票

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

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

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

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


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

没有俄罗斯线路的UTF-8和UCS-2LE都没问题。但如果包含它那么它就失败了。我用手指指着R.你的中文文本对于Windows上的R来说似乎太难了。

Locale似乎与此无关。它只是一个文件,你告诉它文件的编码是什么,为什么你的语言环境很重要?


5
投票

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

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

它工作正常。


1
投票

在Windows上,当您将unicode或utf-8编码的字符串复制粘贴到设置为单字节输入的文本控件(ascii ...取决于区域设置)时,未知字节将被问号替换。如果我取你的字符串的前4个字符并将其复制粘贴到例如记事本然后保存它,文件变为十六进制:

令人惊讶的是

你需要做的是找到一个编辑器,你可以在将文本复制粘贴到其中之前设置为utf-8,然后保存的文件(前4个字符)变为:

52 E5 90 8 E ss Bs Eq Bai FF E8 A2 AB

然后通过[R]将其识别为有效的utf-8。

我用“Notepad2”来试试这个,但我相信还有更多。


1
投票

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

请注意,当您使用非ASCII读取或写入Rstudio(或R?)中的纯文本文件时,仅使编码正确是不够的。区域设置也很重要。

PS。该命令是Sys.setlocale(category =“LC_CTYPE”,locale =“chinese”)。请相应替换区域设置值。


0
投票

crow's answer的基础上,这个解决方案使RStudioSource按钮工作。

当击中那个Source按钮时,RStudio执行source('myfile.r', encoding = 'UTF-8')),所以重写source会使错误消失并按预期运行代码:

source <- function(f, encoding = 'UTF-8') {
    l <- readLines(f, encoding=encoding)
    eval(parse(text=l),envir=.GlobalEnv)
}
© www.soinside.com 2019 - 2024. All rights reserved.