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"替换语言环境(命名有点不一致,请查阅文档).
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等.
我认为问题出在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,您的中文文本似乎也太难了。
这里的语言环境似乎无关紧要。它只是一个文件,您告诉它文件编码是什么,为什么您的语言环境很重要?
对我(在窗户上)我这样做:
source.utf8 <- function(f) {
l <- readLines(f, encoding="UTF-8")
eval(parse(text=l),envir=.GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.
| 归档时间: |
|
| 查看次数: |
33522 次 |
| 最近记录: |