使用UTF-8文本编写的脚本在Windows操作系统中的RStudio和命令行中运行结果不同。

6

我正在处理包含印地语文本的文件并进行解析。我在Rstudio中编写了代码,并且成功地执行了它。但现在,我需要使用R.exe/Rscript.exe从命令行执行相同的脚本,但它不能以同样的方式工作。我已经从RStudio和终端运行了一个简单的脚本:

n_p<-'नाम'

Encoding(n_p)

gregexpr(n_p,c('adfdafc','नाम adsfdfa'))
sessionInfo()

RStudio中的输出:

> n_p<-'नाम'
> 
> Encoding(n_p)
[1] "UTF-8"
> 
> gregexpr(n_p,c('adfdafc','नाम adsfdfa'))
[[1]]
[1] -1
attr(,"match.length")
[1] -1

[[2]]
[1] 1
attr(,"match.length")
[1] 3

> sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7600)

Matrix products: default

locale:
[1] LC_COLLATE=English_India.1252  LC_CTYPE=English_India.1252   
[3] LC_MONETARY=English_India.1252 LC_NUMERIC=C                  
[5] LC_TIME=English_India.1252    

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

other attached packages:
[1] rJava_0.9-10

loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0   

在cmd中使用R.exe输出(用于调试目的。Rscript.exe会给出类似的输出,如果不是完全相同的话)。
> n_p<-'à☼"à☼_à☼r'
>
> Encoding(n_p)
[1] "latin1"
>
> gregexpr(n_p,c('adfdafc','à☼"à☼_à☼r adsfdfa'))
[[1]]
[1] -1
attr(,"match.length")
[1] -1

[[2]]
[1] 1
attr(,"match.length")
[1] 9

> sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7600)

Matrix products: default

locale:
[1] LC_COLLATE=English_India.1252  LC_CTYPE=English_India.1252
[3] LC_MONETARY=English_India.1252 LC_NUMERIC=C
[5] LC_TIME=English_India.1252

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

loaded via a namespace (and not attached):
[1] compiler_3.5.0

我尝试更改语言环境,但是 Sys.setlocale 拒绝正常工作。在某些情况下,gregexpr 在无法解析非 ASCII 代码时会出现错误。最后,即使没有错误运行,它也不能正确匹配正则表达式。目前我无法提供可重现的示例,但稍后我会尝试。请帮忙。

你在这里的期望是什么?你的目标是什么?我明白你正在接收两个不同的输出,但很抱歉我无法理解你试图解决的问题(概述,例如:为什么要使用正则表达式?你正在尝试匹配什么字符串?等等)。谢谢。 - PKumar
1
在你的脚本开头尝试使用 options(encoding = "UTF-8") - Ian Wesley
尝试像这样执行脚本:eval(parse(filename, encoding="UTF-8")) - wp78de
使用stringr包中的str_conv函数(详细信息请点击此处)在您的R脚本中进行转换。当我通过参数将字符串传递给R脚本时,这个函数对我来说至少是有效的。 - undefined
2个回答

5
正确的答案是您应该使用选项--encoding=file encoding来运行Rscript。
无需设置locale,而且正如您可能发现的那样,它也不起作用。如果您的文件是UTF-8: Rscript.exe --encoding=UTF-8 file.R

1
在Windows中,像àé这样的字符对我来说可以工作,但是对于像λ这样的字符,它会出现<ERROR: re-encoding failure from encoding 'UTF-8'>的错误。 - Alessandro Jacopson

1

您需要确保 R 正在适当的区域设置中运行:

使用 Sys.getlocale() 命令来查找当前的区域设置。

您可以使用以下命令设置您的区域设置:

Sys.setlocale(category = "LC_ALL", locale = "hi-IN")

# Try "hi-IN.UTF-8" too...

你可以在这里MSDN这里找到本地化名称。
如果您有正确的值,请将Sys.setlocale()命令放入您的~/.Rprofile中。 参考资料

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接