【问题标题】:Non-english special characters in knitrknitr中的非英文特殊字符
【发布时间】:2026-01-19 03:30:01
【问题描述】:

我正在使用 knitr 1.1。在 R 3.0.0 和 WinEdt (RWinEdt 2.0) 中。我在 knitr 识别瑞典语字符(ä、ö、å)时遇到问题。这不是 R 的问题;这些字符甚至可以在文件名、目录名、对象等中识别。在 Sweave 中也不是问题。

我的文档中已经有\usepackage[utf8]{inputenc},但 knitr 似乎无法处理特殊字符。运行 knitr 后,我收到以下消息:

Warning in remind_sweave(if (in.file) input) :
It seems you are using the Sweave-specific syntax; you may need Sweave2knitr("deskriptiv 130409.Rnw") to convert it to knitr

processing file: deskriptiv 130409.Rnw

(*) NOTE: I saw chunk options "label=läser_in_data"
please go to http://yihui.name/knitr/options (it is likely that you forgot to 
quote "character" options)

Error in parse(text = str_c("alist(", quote_label(params), ")"), srcfile = NULL) : 
1:15: unexpected input
1: alist(label=lä
                 ^
Calls: knit ... parse_params -> withCallingHandlers -> eval -> parse
Execution halted

它抱怨的特定标签是 label=läser。更改标签是不够的,因为如果 R 对象使用 äåö,knitr 甚至会抱怨。

我使用了 Sweave2knitr(),因为该文件最初是为 Sweave 创建的,但结果并不好:现在所有 äåö 都已转换为 äpåö,无论是在 R 块中还是在乳胶文本中,并且knitr 仍然给出错误消息。

会话信息:

R version 3.0.0 (2013-04-03)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Swedish_Sweden.1252  LC_CTYPE=Swedish_Sweden.1252           LC_MONETARY=Swedish_Sweden.1252
[4] LC_NUMERIC=C                    LC_TIME=Swedish_Sweden.1252    
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] knitr_1.1
loaded via a namespace (and not attached):
[1] digest_0.6.3   evaluate_0.4.3 formatR_0.7    stringr_0.6.2  tools_3.0.0   

正如我所提到的,文件名和对象包含瑞典语字符(因为以前这不是问题),而且文本也需要使用瑞典语。

感谢您帮助 knitr 以英语以外的方式工作。

【问题讨论】:

    标签: r utf-8 character-encoding special-characters knitr


    【解决方案1】:

    如果您使用此模式调用knitr,我认为您必须联系WinEdt中R-Sweave mode的维护者。问题是如果您不使用操作系统的本机编码,WinEdt 必须将文件的编码传递给knit()。您提到了UTF-8,但这不是 Windows 的本机编码,因此除非您确定您的文件是 UTF8 编码的,否则不得使用 \usepackage[utf8]{inputenc}

    这里有几个问题混在一起,不可能用一个答案全部解决。

    第一个问题是label=läser,确实应该是label='läser',即你must quote所有的块标签(检查文档中的其他标签也是如此); knitr 尝试在您编写 <<foo>>= 时自动引用您的标签(它被转换为 <<'foo'>>=),但是当您使用 <<label=foo>>= 时这不起作用(您必须明确编写 <<label='foo'>>=)。但是这个问题在这里可能不是必需的。

    我认为这里真正的问题是文件编码(这在 Windows 下很讨厌)。您似乎在默认情况下不尊重UTF-8 的系统下使用UTF-8。在这种情况下,您可以调用knit('yourfile.Rnw', encoding = 'UTF-8'),即将编码传递给knit()。我不使用 WinEdt,所以我不知道该怎么做。您可以hard-code the encoding in the configurations,但不建议这样做。

    两个建议:

    1. Windows下不要使用UTF-8;改用您的系统本机编码(我猜是Windows-1252);
    2. 或者使用RStudio代替WinEdt,可以将编码传递给knitr

    顺便说一句,既然弹出了Sweave2knitr(),那你的Rnw文档肯定有其他问题。要诊断问题,有两种方法:

    1. 如果你使用UTF-8,运行Sweave2knitr('deskriptiv 130409.Rnw', encoding = 'UTF-8')
    2. 如果您使用操作系统的本机编码,只需运行Sweave2knitr('deskriptiv 130409.Rnw')

    如果您对Sweave2knitr() 打印的诊断信息有任何疑问,请阅读documentation

    【讨论】:

    • 谢谢。至少现在我可以在我的文件上运行 knitr() 但特殊字符仍然是一个问题。我更正了 Sweave 部分以符合 knitr()。乳胶文本通过指定(按此顺序)正确运行:
      '\usepackage[utf8]{inputenc}''\usepackage[T1]{fontenc}'。
    • @user2266041 如果您确定您使用的是 UTF-8,Gilbert 的回答应该有效。
    【解决方案2】:

    R-Sweave 通过knitr.edt 宏调用knitr,该宏本身使用knitrSweave.R 中的代码来启动knit。后面这个脚本中的knitcommand 靠近顶部,显示为res <- knit(filename)

    按照亿辉的建议,你可以试试把这条命令换成

    res <- knit(filename, encoding = 'UTF-8')
    

    knitr.edtknitrSweave.R 文件应该在您的%b\Contrib\R-Sweave 文件夹中,其中%b 是您的winEdt 用户文件夹(类似于Win 7 下的"C:\Users\userA\AppData\Roaming\WinEdt Team\WinEdt 7")。

    目前,我不知道如何将编码作为参数传递以避免这种硬编码解决方案。

    我建议避免文件名中的扩展字符,这只会成为问题的根源。就个人而言,我从不使用这样的名字。

    【讨论】:

    • 吉尔伯特:感谢您的回答。我添加了您提到的文本,但 knitr 接受 R 块中的特殊字符仍然存在问题。包含 äåö 的文件名和 R 对象根本不会被读取。