如何在 Windows 下显示带有 Unicode 字符的消息/警告/错误?

Posted

技术标签:

【中文标题】如何在 Windows 下显示带有 Unicode 字符的消息/警告/错误?【英文标题】:How to display a message/warning/error with Unicode characters under Windows? 【发布时间】: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 提交 【参考方案1】:

我注意到 R 中函数 Sys.setlocale() 的帮助说明:“LC_MESSAGES”在不支持消息翻译的系统上将为“C”,Windows 不支持.

对我来说,这听起来像是在任何 Windows 版本上都无法修改 R 消息/错误的字符表示...

【讨论】:

以上是关于如何在 Windows 下显示带有 Unicode 字符的消息/警告/错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 文档中使用特殊字符

如何在Windows命令行中使用unicode字符?

自己编写的中文PHP网页,如何在Unicode(UTF-8)编码下能正常显示汉字而不是乱码?

无法在 Windows 对话框上显示其他 unicode 东亚语言

Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)

带有 knitr 和 Rmarkdown 的 Unicode