'的转换失败:dot替换为,环境:R v 2.15.1在Mac OS 10.8.2上,平台x86_64-apple-darwin9.8.0 / x86_64(64位),RStudio IDE设置为使用UTF-8作为其默认编码。操'/> '的转换失败:dot替换为'/> '的转换失败:dot替换为,环境:R v 2.15.1在Mac OS 10.8.2上,平台x86_64-apple-darwin9.8.0 / x86_64(64位),RStudio IDE设置为使用UTF-8作为其默认编码。操'/> Rhtml:警告:'mbcsToSbcs'中'<var>'的转换失败:dot替换为<var> | 所有编程讨论 | zhouni.net

问题 Rhtml:警告:'mbcsToSbcs'中''的转换失败:dot替换为


环境:

R v 2.15.1在Mac OS 10.8.2上,平台x86_64-apple-darwin9.8.0 / x86_64(64位),RStudio IDE设置为使用UTF-8作为其默认编码。操作系统也使用UTF-8。

> Sys.getlocale(category = "LC_ALL")
[1] "sk_SK.UTF-8/sk_SK.UTF-8/sk_SK.UTF-8/C/sk_SK.UTF-8/sk_SK.UTF-8"

目的:

从R HTML(.Rhtml)文件生成HTML文件,其中包含带有扩展拉丁字符的图,例如š或č。

问题:

当我点击 编织HTML,输出看起来像这样:

plot(1:2, main = "šč")
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## 
## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for
## <8d>
**Plot with correct characters despite the warnings.**

题:

是什么导致问题以及如何解决?我怎样才能至少摆脱结果文件中显示的警告?

无望的说明:

我一直在寻找过去一两个小时的解决方案,发现了许多类似的案例,并尝试了许多不同的潜在解决方案(许多与PDF输出相关,如果我只使用Sweave,它会以相同的方式竖起),现在我确实绝望。

2012年11月9日编辑:

解决方案使用 Encoding() 由@metasequoia建议确实有效,但考虑到打印代码的需要,最好没有该功能,我更喜欢@nograpes使用该功能提供的解决方案 pdf.options()

尽管如此,有趣的是

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
plot(cars, main="Ťažký")
end.rcode-->

产生相同的警告,

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

<!--begin.rcode
plot(cars, main="Ťažký")
end.rcode-->

按预期工作。 这是为什么? 我认为在R中运行命令时,年表是最重要的。

因此,我的目的的明确解决方案是

<!--begin.rcode echo="FALSE"
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

在我的每个代码的开头。


9968
2017-11-06 13:03


起源

可能不是你正在寻找的wat,但是如何包装情节电话 suppressWarnings - Romain Francois
没有可重复的例子,我无法测试解决方案。但是,您可以考虑声明您的编码 Encoding() - metasequoia
@RomainFrancois感谢您的建议。当我不必打印代码时,它很有用,但是如果我这样做,封装也是可见的。有没有办法在全球范围内压制警告? - Harold Cavendish
我能够在Ubuntu中重现这个问题。我在Windows中遇到了不同的错误,但类似。编辑您的问题并提供输入文件的示例(test.Rhtml) 喜欢: <!--begin.rcode plot(1:2, main = "šč") end.rcode--> 和一个像这样的命令: library(knitr);knit('test.Rhtml') 以及输出的一个例子,包括: <div class="warning"><pre class="knitr r">## Warning: conversion failure on 'šč' in 'mbcsToSbcs': dot substituted for ## <c5> - nograpes
此错误与问题有关 pdf 设备,我相信。您可以使用快速重现错误 pdf();plot(1:2,main="šč");dev.off() - nograpes


答案:


来自@metasequoia的答案有效,但我想补充几点。如果将PDF选项设置为其他编码,则无需包含所有输出文本 Encoding。单击之前运行此命令 编织HTML

pdf.options(encoding='ISOLatin2.enc')

Ripley谈论编码问题,特别是与PDF相关的问题 这里的帖子,它可能是有趣的。值得注意的是,这种错误在Windows上不会以相同的方式发生,因为编码是以完全不同的方式处理的。

其他语言可能需要不同的编码文件,但这似乎适用于斯洛伐克语。


6
2017-11-08 23:17



谢谢,这可能是我至少可以使用的最佳解决方案。有没有计划解决有问题的问题?例如这样 pdf() 支持UTF-8。 - Harold Cavendish
@HarroldCavendish查看我在答案中提到的帖子;里普利提到了这一点 pdf() 不支持UTF-8,因为底层图形语言不支持UTF-8。 - nograpes
我看过了。那么升级底层图形语言是否可能?这个领域是否有任何持续的发展?请原谅我对这个话题缺乏经验。 - Harold Cavendish
@HarroldCavendish我认为他的意思是PDF本身不支持UTF-8。所以我们必须解决Adobe的选择。 - nograpes


只是为了解释你找到的解决方案:

<!--begin.rcode
pdf.options(encoding='ISOLatin2.enc')
end.rcode-->

<!--begin.rcode
plot(cars, main="Ťažký")
end.rcode-->

这可以工作,但是当你将两行放在同一个块中时它不起作用,因为对于每个代码块, knitr 打开一个新的图形设备来记录图(默认情况下它是一个PDF设备)。设置为时已晚 pdf.options() 因为放置时设备已使用默认编码打开 pdf.options() 和 plot() 在同一块。

在工作解决方案中,当PDF设备为第二个块打开时,它从前一个块中的设置继承编码;这就是它如何正确生成字符。

如果您不想在每个Rhtml文件中设置此编码选项,则可以将其放入 ~/.Rprofile 所以它会影响你的所有PDF设备。或者你定义自己的函数来编织Rhtml文件,例如

knit2 = function(...) {
   pdf.options(encoding='ISOLatin2.enc')
   knitr::knit(...)
}

然后 knit2('yourfile.Rhtml')


5
2017-11-09 16:56



感谢您的解释。我的意思是跑 pdf.options(encoding='ISOLatin2.enc') 在您的R会话中,不要将其包含在.Rhtml文件中。我认为这基本上与把它放在你的相同 ~/.Rprofile。 - nograpes
此外,我想知道是否有意义 knitr 抓住这些警告并建议解决方案。您仍然可以输出警告,但添加一条消息,提示“您可能想尝试 pdf.options(encoding='x')”。 - nograpes
这听起来不错 pdf.options() 自动,但很难确定 x 在这里(编码对我来说是一个难题)。我认为我能做的就是把它作为FAQ。 - Yihui Xie
嗯,你可能只能指出人们 grDevices/inst/enc/ 目录并告诉他们找到正确的编码文件。 - nograpes
是的,我可以按照您的建议列出可能的编码。我的意思是我不确定哪种编码是正确的。谢谢! - Yihui Xie


使用@nograpes可重现的近似示例(Mac OSX上的R 2.15.1):

pdf()
plot(1:2,main="šč")
dev.off()

我能够复制OP的错误代码。用“包装”包装“šč” Encoding() 消除了警告信息。

pdf()
plot(1:2,main=Encoding("šč"))
dev.off()

2
2017-11-08 22:48



非常感谢,这也适用,但它不如@nograpes解决方案那么方便。 - Harold Cavendish