我有一个包含“特殊字符”的RMarkdown文档,例如ë
。如果我使用RStudio Server的“编织文档”按钮渲染文档,它会渲染得很好。当我通过使用RStudio Server按钮来渲染另一个调用RMarkdown
的{{1}}函数的R脚本来渲染它时,它也会渲染得很好。
然而,由于某种原因超出了我(但希望不会长久),当render
使用以下内容调用相同的R脚本时,我会得到不同的结果:
index.php
当我这样做时,在生成的.html文件中,特殊符号(我猜unicode符号)被$results = shell_exec("R --file='/home/username/public_html/some/subdirectories/process.R' --no-save 2>&1");
替换。我试图查看这是否是某种我尚未了解的HTML元素变体,但我一直无法找到任何相关内容。
(注意:任何指向我可以了解更多相关信息的地方的链接(而且,当我们看到它时,为什么我的浏览器不显示它,例如,它代表的ë,也非常感谢!)
可再现的示例
<U+00EB>
的内容:
example.php
<?php
shell_exec("R --file='/home/username/public_html/subdirectory/example.R' --no-save 2>&1");
?>
的内容(这是我在服务器上需要的内容):
example.R
workingPath <- "/home/username/public_html/subdirectory";
### Set path to RStudio's pandoc version
Sys.setenv(PATH=paste(Sys.getenv("PATH"),
"/usr/lib/rstudio-server/bin/pandoc",
sep=":"));
### Set HOME and LANG
Sys.setenv(HOME = '/home/username');
Sys.setenv(LANG = 'en_US.UTF-8');
require(rmarkdown);
renderResults <-
render(file.path(workingPath, 'example.Rmd'),
output_file = file.path(workingPath, 'example.html'),
intermediates_dir = file.path(workingPath, 'tmp'),
encoding="UTF-8");
的内容:
example.Rmd
此示例的结果:
当我从R Studio运行时,我得到:
cat(“这是一个符号。”);
##这是一个ë符号。
当我从PHP运行时,我得到:
cat(“这是一个符号。”);
##这是&lt; U + 00EB&gt;符号
(请注意,有趣的是,---
title: 'Reproducable example'
output: html_document
---
```{r}
cat("This is an ë symbol.");
```
'edë确实正常出现......)
我现在在echo
文件中使用了str_replace
,但这并不理想。
我已经检查了index.php
手册,但我找不到任何有关此行为的信息。
我还看过在.Rmd文件的YAML标题中指定render
的选项,但似乎唯一接近的是--ascii
option,这不是任何东西。 R Studio RMarkdown page也没有提供任何提示。
它可能与RStudio中设置的环境变量有关吗?我已经不得不设置:
pandoc
在R脚本中,在从PHP shell调用的R脚本中调用时,首先让Pandoc进入;但如果这是问题,我如何确定RStudio设置哪些设置值,或者更准确地说,哪些设置重要?我跑了:
Sys.setenv(HOME = '/home/oupsyusr');
Sys.setenv(LANG = 'en_US.UTF-8');
从R Studio中,显示了相当多的列表。我认为没有任何条目与编码等有关。
或者,knitr会导致这个吗?当我存储并检查.md文件时,Unicode元素已经显示出来了。但是,knitr help page with chunk options一般没有说明unicode或编码。
有人知道记录在哪里,或者有人碰巧遇到过这种情况吗?
我在CentOS 6.8上运行RStudio 0.99.903和R 3.3.1。
答案 0 :(得分:5)
通常,此形式的问题(其中unicode字符转换为unicode代码点表示,在本例中为<U+00EB>
)是由尝试在非UTF-8语言环境中运行R引起的。 / p>
通常,可以通过检查Sys.getlocale("LC_ALL")
的输出来验证这一点。如果您看到报告了C
语言环境,那么您可能需要使用以下内容强制执行UTF-8语言环境:
Sys.setlocale("LC_ALL", "en_US.UTF-8")
根据您所需的语言替换特定的UTF-8语言环境。 (作为参考,通常可以使用类似locale -a
)的终端查询可用语言环境集。