我有一个doc.Rnw,可以生成一些俄语UTF-8字符串:
\documentclass{article}
\usepackage{inputenc}
\inputencoding{utf8}
\usepackage[main=english,russian]{babel}
\begin{document}
\selectlanguage {russian}
<<test, results='asis', echo=FALSE>>=
print(readLines('string.rus', encoding="UTF-8"))
print("Здравствуйте")
@
Здравствуйте
\selectlanguage {english}
\end{document}string.rus有一个UTF-8字符串,在R控制台中正确显示:
print(readLines('string.rus', encoding="UTF-8"))
# [1] "Здравствуйте"doc.Rnw会直接显示在Windows记事本中,而两者都是:
file.show("doc.Rnw")
file.show("doc.Rnw", encoding="UTF-8")无法正确显示UTF-8字符串。
使用:
knit("doc.Rnw")输出doc.tex的文档部分显示:
\begin{document}
\selectlanguage {russian}
[1] "<U+0417><U+0434><U+0440><U+0430><U+0432><U+0441><U+0442><U+0432><U+0443><U+0439><U+0442><U+0435>"
[1] " <U+0097>д <U+0080>авс <U+0082>в <U+0083>й <U+0082>е"
Здравствуйте
\selectlanguage {english}
\end{document}它当然不能在PDFLaTeX中编译。使用:
knit("doc.Rnw", encoding="UTF-8")结果会更糟。
注释应该生成UTF-8字符串的块:
print(readLines('string.rus', encoding="UTF-8"))
print("Здравствуйте")给出了一个有效的doc.tex,它可以在MikTeX中编译并正确显示剩余的UTF-8字符串。
即使我注释了第一个print...,只留下第二个。我不会编译。这似乎证明了doc.Rnw的原始编码是正确的。
我尝试将这两个print命令替换为:
a="Здравствуйте"
Encoding(a)="UTF-8"
print(a)在这种情况下,我可以编译,但PDF输出是(第一个字符串从边距中删除):
[1] «U+0417><U+0434><U+0440><U+0430><U+0432><U+0441><U+0442><U+0432><U+0443>
Здравствуйте因此,块输出仍然是错误的。
如何正确打印块中的UTF-8字符串?
适用于Windows的R版本为3.3.3 (2017-03-06),针织版本为1.15.1 (2016-11-22)。
发布于 2017-05-13 00:55:59
下面是一个扩展的工作示例:
\documentclass{article}
\usepackage{inputenc}
\inputencoding{utf8}
\usepackage[main=english,russian]{babel}
\begin{document}
\selectlanguage {russian}
<<test, results='asis', echo=FALSE>>=
s=readLines('string.rus', , encoding="UTF-8")
message("s ", Encoding(s), ": ", s)
Encoding(s)="latin1"
message("s latin1: ", s)
Encoding(s)="unkwnown"
message("s unkwnown: ", s)
Encoding(s)="utf8"
message("s utf8: ", a)
a="Здравствуйте"
message("a ", Encoding(a), ": ", a)
Encoding(a)="latin1"
message("a latin1: ", a)
Encoding(a)="utf8"
message("a utf8: ", a)
Encoding(a)="UTF-8"
message("a UTF-8: ", a)
u=("\U0417")
message("u ", Encoding(u), ": ", u)
Encoding(u)="latin1"
message("u latin1: ", u)
Encoding(u)="unkwnown"
message("u unkwnown: ", u)
@
Здравствуйте
\selectlanguage {english}
\end{document}在knit("doc.Rnw"之后,这是与在doc.tex中找到的test块相关的输出(没有为了可读性而进行编织代码修饰):
s UTF-8: <U+0417><U+0434><U+0440><U+0430><U+0432><U+0441><U+0442><U+0432><U+0443><U+0439><U+0442><U+0435>
s latin1: Здравствуйте
s unkwnown: Здравствуйте
s utf8: <U+0417><U+0434><U+0440><U+0430><U+0432><U+0441><U+0442><U+0432><U+0443><U+0439><U+0442><U+0435>
a unknown: Здравствуйте
a latin1: Здравствуйте
a utf8: Здравствуйте
a UTF-8: <U+0417><U+0434><U+0440><U+0430><U+0432><U+0441><U+0442><U+0432><U+0443><U+0439><U+0442><U+0435>
u UTF-8: <U+0417>
u latin1: З
u unkwnown: З下面是一些评论。
首先,只有message()可以工作,print()总是会给出错误。
在外部读取的字符串s和本地设置的a中,行为都很奇怪。
实际上,保留或显式地将代码设置为UTF-8会产生错误的结果(utf8适用于a)。
有人可能认为文档(doc.Rnw和string.rus)的UTF8编码设置不正确。这就是为什么我添加了u=("\U0417")这一行,它肯定是UTF8。同样,只有删除UTF8编码才能得到正确的输出。
以类似的方式,显式请求UTF8输出:
knit("doc.Rnw", encoding="UTF-8")不会生成UTF8字符,但会生成其Unicode值或奇怪的值。
最后,我可以生成所需的.tex文件并编译它的LaTeX,但是为什么会出现上述违反直觉的行为?
希望有人能给出一个很好的解释。
https://stackoverflow.com/questions/43936536
复制相似问题