如何正确地输入国际化文本?

时间:2012-07-06 20:40:15

标签: r internationalization

我有很多来自国外的作者姓名,其中R读取得很好。我正在尝试清理它们以便上传到Mechanical Turk(它真的不喜欢一个国际化的角色)。这样做,我有一个问题(稍后发布),但我甚至不能以合理的方式dput

> dput(df[306,"primauthfirstname"])
"Gwena\xeblle M"
> test <- "Gwena\xeblle M"
<simpleError in nchar(val): invalid multibyte string 1>

换句话说,dput工作正常,但粘贴结果失败。为什么dput不输出必要的信息以允许复制/粘贴回R(可能它需要做的就是在结构语句中添加编码属性?)。我该怎么做呢?

请注意,就{R}而言,\xeb是一个有效字符:

> gsub("\xeb","", turk.df[306,"primauthfirstname"] )
[1] "Gwenalle M"

但是你不能单独评估这些字符 - 它是十六进制代码\ x ##或者没有:

> gsub("\\x","", turk.df[306,"primauthfirstname"] )
[1] "Gwena\xeblle M"

1 个答案:

答案 0 :(得分:1)

dput()的helppage说:“写一个R对象的ASCII文本表示”。因此,如果您的对象包含非ASCII字符,则无法表示这些字符,并且必须以某种方式进行转换。

因此我建议您使用iconv()dput之前转换您的向量。一种方法是:

> test <- "Gwena\xeblle M"
> out <- iconv(test, from="latin1", to="ASCII", sub="byte")
> out
[1] "Gwena<eb>lle M"
> gsub('<eb>', 'ë', out)
[1] "Gwenaëlle M"
如你所见,

可以两种方式运作。您可以稍后使用gsub()将字节反向转换为字符(如果您的编码支持它,例如utf-8)。

第二种方法更简单(我认为更适合您的需要),但是单向工作,而您的libiconv可能不支持它:

> test <- "Gwena\xeblle M"
> iconv(test, from="latin1", to="ASCII//TRANSLIT")
[1] "Gwenaelle M"

希望这有帮助!