在R中打印Unicode字符字符串

37

我在.csv文件中输入了一个包含Unicode符号如:\U00B5 g/dL的文本字符串。同时也可以在R数据框中读取.csv文件:

enter image description here

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中打印该符号。

非常感谢您的帮助!


1
在我看来,问题似乎不在于正确地打印Unicode字符,而在于正确地从文件中读取Unicode文本并将其解释为Unicode字符串。 - Alex A.
我同意。你尝试过使用UTF-8编码文件吗? - Rich Scriven
1
如果按照@RichardScriven的建议使用UTF-8编码文件,您可以在read.csv()函数调用中使用fileEncoding="UTF-8", allowEscapes=T - Alex A.
3
如果你在文本文件中字面上有"\U00B5 g/dL",那不是Unicode,而只是ASCII斜杠后跟着字母和数字。我不清楚你的CSV文件中具体有什么内容。如果你能提供一个可重现的示例(特别是显示文件字节的示例),那就太好了。 - MrFlick
1
@AlexA。是的,那就是问题所在!如果我手动输入,它可以正常工作。但是如果我从一个.csv文件导入,它会添加 \\ - outboundbird
显示剩余5条评论
1个回答

65

首先要了解,在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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接