使用utf-8文本的脚本与Windows中的RStudio和命令行运行不同

时间:2018-06-08 13:30:17

标签: r regex windows utf-8

我正在处理包含印地语文本的文件并解析它们。我在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代码时会出错。最后,当它运行没有错误时,它不能正确匹配正则表达式。我目前无法提供可重复的示例,但我会稍后尝试。

帮助。

2 个答案:

答案 0 :(得分:3)

正确的答案是您应该使用--encoding = file encoding选项运行Rscript

不需要设置区域设置,而且您可能已经发现,它仍然无法正常工作。如果您的文件是UTF-8: Rscript.exe --encoding = UTF-8文件。R

答案 1 :(得分:0)

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

运行rterm使用:Sys.getlocale()查找您当前的区域设置。

您可以使用以下方式设置语言区域:

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

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

您可以找到区域设置名称hereMSDNhere

如果您的值正确,请将Sys.setlocale()命令放入~/.Rprofile

<强>参考