【问题标题】:Print unicode character string in R在R中打印unicode字符串
【发布时间】:2015-03-25 19:48:57
【问题描述】:

我在 .csv 文件中输入了一个文本字符串,其中包括 unicode 符号:\U00B5 g/dL。 在.csv 文件中以及读入 R 数据框:

test=read.csv("test.csv")

\U00B5 会产生微信号- µ。 R 按原样将其读入数据文件(\U00B5)。但是,当我打印字符串时,它显示为\\U00B5 g/dL
或者,手动输入代码也可以。

varname <- c("a", "b", "c")
labels <- c("A \U00B5 g/dL", "B \U00B5 g/dL", "C \U00B5 g/dL")
df <- data.frame(varname, labels)
test <- data.frame(varname, labels)
test
#  varname   labels
#  1       a A µ g/dL
#  2       b B µ g/dL
#  3       c C µ g/dL

我想知道在这种情况下如何摆脱转义符号\ 并让它打印出符号。 或者,如果有另一种方法可以打印出 R 中的符号。

非常感谢您的帮助!

【问题讨论】:

  • 当你说,但是当我打印字符串时它显示为\\U00B5 g/dL,你在哪里打印字符串?
  • 在我看来,问题不在于正确打印 unicode 字符,而在于正确地从文件中读取文字 unicode 文本并将其解释为 unicode 字符串。
  • 如果您按照@RichardScriven 的建议使用UTF-8 对文件进行编码,您可以在调用read.csv() 时使用fileEncoding="UTF-8", allowEscapes=T
  • 如果您在文本文件中确实有“\U00B5 g/dL”,那不是 Unicode。这只是一个 ASCII 斜线,后跟字母和数字。我不清楚你的 csv 文件中有什么。如果您提供一个可重现的示例(特别是显示文件的字节),那就太好了
  • @AlexA。是的。那就是问题所在!如果我手动输入它,它工作正常。但如果我从 .csv 文件导入。它会添加`\`。

标签: r unicode


【解决方案1】:

好吧,首先要了解,如果 R 中的某些字符超出标准 ASCII 字符,则必须对其进行转义。通常这是使用“\”字符完成的。这就是为什么在 R 中编写字符串时需要转义该字符的原因:

a <- "\" # error
a <- "\\" # ok.

"\U" 是 unicode 转义的特殊指示符。请注意,当您使用此转义时,字符串本身中没有斜杠或 U。它只是特定角色的捷径。注意:

a <- "\U00B5"
cat(a)
# µ
grep("U",a)
# integer(0)
nchar(a)
# [1] 1

这和字符串很不一样

a <- "\\U00B5"
cat(a)
# \U00B5
grep("U",a)
# [1] 1
nchar(a)
# [1] 6

通常,当您导入文本文件时,您会以文件使用的任何编码(UTF-8 或 Latin-1 是最常见的)对非 ASCII 字符进行编码。它们有特殊的字节来表示这些字符。文本文件具有 Unicode 字符的 ASCII 转义序列是不“正常的”。这就是为什么 R 不会尝试将 "\U00B5" 转换为 unicode 字符的原因,因为它假定如果您想要一个 unicode 字符,您会直接使用它。

重新解释 ASCII 字符值的最简单方法是使用 stringi 包。例如

library(stringi)
a <- "\\U00B5"
stri_unescape_unicode(gsub("\\U","\\u",a, fixed=TRUE))

(唯一的问题是我们需要将“\U”转换为更常见的“\u”,以便函数正确识别转义)。您可以使用

对导入的数据执行此操作
test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE))

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 2014-08-23
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多