R中的特殊字符

3
我正在努力将对话文本转换为R可读取的格式。但是,我遇到了一些特殊字符,例如卷曲引号、短横线等。通常情况下,我会在微软产品中使用replace来替换这些特殊字符。通常情况下,我会用普通文本替换特殊字符,但有时也希望用其他字符替换它们(例如,我会用 { } 替换 “ ”)。这很繁琐,而且不总是彻底的。如果我可以按原样将文本读入R,然后使用编码将其转换为可识别的Unicode格式,我就可以使用gsub将其替换为普通文本版本。但是,文件以我不理解的某种方式被读入了。以下是我的数据可能看起来像的xlsx文件:

http://dl.dropbox.com/u/61803503/test.xlsx

这是 .xlsx 文件中的内容

text                              num
“ ” curly quotes                    1
en dash (–) and the em dash (—)     2
‘ ’ curly apostrophe-ugg            3
…  ellipsis are uck in R            4

这可以用以下方式读入R:

URL <- "http://dl.dropbox.com/u/61803503/test.xlsx"
library(gdata) 
z <- read.xls(URL, stringsAsFactors = FALSE) 

结果是:
                                 text num
1                “ †curly quotes    1
2 en dash (–) and the em dash (—)   2
3        ‘ ’ curly apostrophe-ugg   3
4          …  ellipsis are uck in R   4

于是我尝试使用 Encoding 进行转换为 Unicode:

iconv(z[, 1], "latin1", "UTF-8")

这将给出:
[1] "â\u0080\u009c â\u0080\u009d curly quotes"                "en dash (â\u0080\u0093) and the em dash (â\u0080\u0094)"
[3] "â\u0080\u0098 â\u0080\u0099 curly apostrophe-ugg"        "â\u0080¦  ellipsis are uck in R"     

这使得使用gsub的效果不佳。

我该怎么做才能将这些特殊字符转换为可区分的Unicode,以便我可以适当地进行gsub处理?更明确地说,我希望z [1,1]的读数为:

\u201C 2\u01D curly quotes

为了让我的期望结果更加清晰,我将从像维基百科这样的页面中抓取表格:http://en.wikipedia.org/wiki/Quotation_mark_glyphs 并使用Unicode参考图表适当地替换字符。因此,我需要将字符转换为Unicode或某种标准格式,以便我可以系统地遍历并替换字符。也许它已经是Unicode格式了,而我却没有注意到。
PS:我不将文件保存为.csv或纯文本,因为特殊字符会被替换为?,因此使用read.xls。如果您有更好的读取文件方法(例如read.xls),我并不固执。

你的编码可能是“cp1252”,Windows编码方案,而不是“latin1”。 - Andrie
@mrdwab 当我整理好了代码后,我也整理了Excel文件。我认为我已经有了一个很好的方向来解决ttmaccer和你的答案之间的问题。我会删除以前的评论,最终也会删除这个评论,以满足你的要求。 - Tyler Rinker
2个回答

9
也许这会有所帮助(我明天将能够访问Windows机器,如果SO不能先回答你的问题,我可能会更多地尝试)。
在我的Linux系统上,当我执行以下操作时:
iconv(z$text, "", "cp1252")

I get:

[1] "\x93 \x94 curly quotes"                "en dash (\x96) and the em dash (\x97)"
[3] "\x91 \x92 curly apostrophe-ugg"        "\x85  ellipsis are uck in R"  

这不是UTF,而是(我相信)ISO十六进制实体。但是,如果您能够到达这个点,那么您应该能够按照您的意图使用。请参见此页面(特别是保留部分)进行转换。

更新

您还可以尝试转换为没有这些字符的编码,比如ASCII,并将sub设置为"byte"。在我的机器上,这给了我:
iconv(z$text, "", "ASCII", "byte")
# [1] "<e2><80><9c> <e2><80><9d> curly quotes"               
# [2] "en dash (<e2><80><93>) and the em dash (<e2><80><94>)"
# [3] "<e2><80><98> <e2><80><99> curly apostrophe-ugg"       
# [4] "<e2><80><a6>  ellipsis are uck in R"   

虽然看起来很丑,但是UTF-8(e2, 80, 9c)是一个正确的右单引号(我相信每个字符都是一组三个值的尖括号)。您可以在此网站上查找转换,您可以通过标点符号名称进行搜索。


2
很抱歉刚回来,这是一个很难解决的问题。你的第二个解决方案解决了我的问题。 - Tyler Rinker
这是我基于这个所用的代码:doc = iconv(doc, "UTF-8", "cp1252"); doc = gsub("(\x93|\x94)", "\"", doc, perl=T) - Chris Kennedy

1

尝试

> iconv(z, "UTF-8", "UTF-8") 
[1] "c(\"“—” curly quotes\", \"en dash (–) and the em dash (—)\", \"‘—’ curly apostrophe-ugg\", \"…  ellipsis are uck in R\")"
[2] "c(1, 2, 3, 4)"  

Windows在编码方面存在很多问题。也许你可以看看http://www.vmware.com/products/player/并运行Linux。

这在我的Windows电脑上可以运行。最初的输入与你的相同。你可能会有不同的体验。


谢谢,这可能需要一些时间来尝试各种方法让它正常工作。我需要它能够在多个平台上运行,所以一旦我在Windows上解决了它,我会在OSX和Linux上进行处理。 - Tyler Rinker

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