【发布时间】:2015-12-18 05:07:17
【问题描述】:
我有一条包含 Unicode 字符的消息(或警告或错误)。 (字符串有UTF-8 编码。)
x <- "\u20AC \ub124" # a euro symbol, and Hangul 'ne'
## [1] "€ 네"
Encoding(x)
## [1] "UTF-8"
在 Linux 下,如果语言环境是 UTF-8(l10n_info()$`UTF-8` 返回 TRUE),则会在消息中打印 OK。
我可以强制这样做,例如,
devtools::with_locale(
c(LC_CTYPE = "en_US.utf8"),
message(x)
)
## € 네
在 Windows 下没有 UTF-8 语言环境,所以我找不到强制正确打印的等效方法。例如,对于美国语言环境,韩文字符无法正确显示。
devtools::with_locale(
c(LC_CTYPE = "English_United States"),
message(x)
)
## € <U+B124>
在 Windows 下打印数据帧时,有一个带有 Unicode 字符的 related problem 无法正确显示。那里的建议是将语言环境设置为中文/日文/韩文。这在这里不起作用。
devtools::with_locale(
c(LC_CTYPE = "Korean_Korea"),
message(x)
)
## ¢æ ³× # equivalent to iconv(x, "UTF-8", "EUC-KR")
如何在 Windows 下正确显示 UTF-8 消息、警告和错误?
【问题讨论】:
-
您指的是哪个 Windows 版本?我怀疑你无法在 Windows 7 上解决这个问题,但也许其他版本最终获得了适当的 Unicode 支持。 (但是我没有屏住呼吸)
-
@mpiktas 我在 Windows 7 下对其进行了测试,尽管 AFAIK,R 也不支持新版本 Windows 的 UTF-8 语言环境,所以我怀疑这个问题适用于所有版本。很高兴被证明是错误的。
-
我怀疑打印到 stderr 有问题。
message打印到 stderr,然后我们有一个问题:比较cat(x, file = stdout())和cat(x, file = stderr())。我尝试查看 R 源代码,但我发现打印到 stdout 和 stderr 是通过不同的函数完成的,但我缺乏 R 内部知识,无法找到问题的根源。 -
另外,如果您查看
Encoding(capture.output(print(x))),您会发现编码不是“UTF-8”。所以我只能推测,当打印到标准错误时,编码信息的某个地方会被破坏。 -
@mpiktas 是的,
capture.output的问题是我前几天发现的一个错误。 bugs.r-project.org/bugzilla3/show_bug.cgi?id=16539,我已经将此 stderr 问题作为另一个错误 bugs.r-project.org/bugzilla3/show_bug.cgi?id=16543 提交