首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chunks :从块生成UTF-8输出

chunks :从块生成UTF-8输出
EN

Stack Overflow用户
提问于 2017-05-12 19:17:57
回答 1查看 535关注 0票数 1

我有一个doc.Rnw,可以生成一些俄语UTF-8字符串:

代码语言:javascript
复制
\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控制台中正确显示:

代码语言:javascript
复制
print(readLines('string.rus', encoding="UTF-8"))    
# [1] "Здравствуйте"

doc.Rnw会直接显示在Windows记事本中,而两者都是:

代码语言:javascript
复制
file.show("doc.Rnw")
file.show("doc.Rnw", encoding="UTF-8")

无法正确显示UTF-8字符串。

使用:

代码语言:javascript
复制
knit("doc.Rnw")

输出doc.tex的文档部分显示:

代码语言:javascript
复制
\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中编译。使用:

代码语言:javascript
复制
knit("doc.Rnw", encoding="UTF-8")

结果会更糟。

注释应该生成UTF-8字符串的块:

代码语言:javascript
复制
print(readLines('string.rus', encoding="UTF-8"))     
print("Здравствуйте")

给出了一个有效的doc.tex,它可以在MikTeX中编译并正确显示剩余的UTF-8字符串。

即使我注释了第一个print...,只留下第二个。我不会编译。这似乎证明了doc.Rnw的原始编码是正确的。

我尝试将这两个print命令替换为:

代码语言:javascript
复制
a="Здравствуйте"
Encoding(a)="UTF-8"
print(a)

在这种情况下,我可以编译,但PDF输出是(第一个字符串从边距中删除):

代码语言:javascript
复制
[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)。

EN

回答 1

Stack Overflow用户

发布于 2017-05-13 00:55:59

下面是一个扩展的工作示例:

代码语言:javascript
复制
\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块相关的输出(没有为了可读性而进行编织代码修饰):

代码语言:javascript
复制
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.Rnwstring.rus)的UTF8编码设置不正确。这就是为什么我添加了u=("\U0417")这一行,它肯定是UTF8。同样,只有删除UTF8编码才能得到正确的输出。

以类似的方式,显式请求UTF8输出:

代码语言:javascript
复制
knit("doc.Rnw", encoding="UTF-8")

不会生成UTF8字符,但会生成其Unicode值或奇怪的值。

最后,我可以生成所需的.tex文件并编译它的LaTeX,但是为什么会出现上述违反直觉的行为?

希望有人能给出一个很好的解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43936536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档