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

Ari*_*man 7 r internationalization

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

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

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

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

> gsub("\xeb","", turk.df[306,"primauthfirstname"] )
[1] "Gwenalle M"
Run Code Online (Sandbox Code Playgroud)

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

> gsub("\\x","", turk.df[306,"primauthfirstname"] )
[1] "Gwena\xeblle M"
Run Code Online (Sandbox Code Playgroud)

The*_*ras 1

dput()\ 的帮助页面显示:“写入 R 对象的 ASCII 文本表示形式”。因此,如果您的对象包含非 ASCII 字符,则这些字符无法表示并且必须以某种方式进行转换。

\n\n

所以我建议你在使用iconv()之前先转换你的向量dput。一种方法是:

\n\n
> test <- "Gwena\\xeblle M"\n> out <- iconv(test, from="latin1", to="ASCII", sub="byte")\n> out\n[1] "Gwena<eb>lle M"\n> gsub(\'<eb>\', \'\xc3\xab\', out)\n[1] "Gwena\xc3\xablle M"\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,这是双向的。您稍后可以使用gsub()将字节反向转换为字符(如果您的编码支持它,例如 utf-8)。

\n\n

第二种方法更简单(我想更适合您的需求),但它是单向的,您的 libiconv 可能不支持它:

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

希望这可以帮助!

\n