将unicode转换为可读的字符串

时间:2018-12-11 10:46:41

标签: r twitter unicode utf-8

我在 R 中的对象包含以下从twitter提取的unicode。

  

\ xe0 \ xae \ xa8 \ xe0 \ xae \ x9f \ xe0 \ xae \ xbf \ xe0 \ xae \ x95 \ xe0 \ xae \ xb0 \ xe0 \ xaf \ x8d   \ xe0 \ xae \ x9a \ xe0 \ xaf \ x82 \ xe0 \ xae \ xb0 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xaf \ xe0 \ xae \ xbe   \ xe0 \ xae \ x9a \ xe0 \ xaf \ x86 \ xe0 \ xae \ xaf \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa4   \ xe0 \ xae \ x89 \ xe0 \ xae \ xa4 \ xe0 \ xae \ xb5 \ xe0 \ xae \ xbf   \ xe0 \ xae \ xae \ xe0 \ xae \ xbf \ xe0 \ xae \ x95   \ xe0 \ xae \ xae \ xe0 \ xaf \ x81 \ xe0 \ xae \ x95 \ xe0 \ xaf \ x8d \ xe0 \ xae \ x95 \ xe0 \ xae \ xbf \ xe0 \ xae \ xaf \ xe0 \ xae \ xae \ xe0 \ xae \ xbe \ xe0 \ xae \ xa9 \ xe0 \ xae \ xa4 \ xe0 \ xaf \ x81!'   -\ xe0 \ xae \ x9f \ xe0 \ xaf \ x86 \ xe0 \ xae \ xb2 \ xe0 \ xaf \ x8d \ xe0 \ xae \ x9f \ xe0 \ xae \ xbe \ xe0 \ xae \ xb5 \ xe0 \ xae \ xbf \ xe0 \ xae \ xb2 \ xe0 \ xaf \ x8d   \ xe0 \ xae \ xa8 \ xe0 \ xaf \ x86 \ xe0 \ xae \ x95 \ xe0 \ xae \ xbf \ xe0 \ xae \ xb4 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa8 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa4   \ xe0 \ xae \ x9a \ xe0 \ xaf \ x80 \ xe0 \ xae \ xae \ xe0 \ xae \ xbe \ xe0 \ xae \ xa9 \ xe0 \ xaf \ x8d

我需要将它们转换为人类可读的字符串。如果我只是将其放在字符串中,例如

x <- "\xe0\xae\xa8\xe0\xae\x9f\xe0\xae\xbf\xe0\xae\x95\xe0\xae\xb0\xe0\xaf\x8d \xe0\xae\x9a\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\xe0\xae\xaf\xe0\xae\xbe \xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xaf\xe0\xaf\x8d\xe0\xae\xa4 \xe0\xae\x89\xe0\xae\xa4\xe0\xae\xb5\xe0\xae\xbf \xe0\xae\xae\xe0\xae\xbf\xe0\xae\x95 \xe0\xae\xae\xe0\xaf\x81\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xa9\xe0\xae\xa4\xe0\xaf\x81!' - \xe0\xae\x9f\xe0\xaf\x86\xe0\xae\xb2\xe0\xaf\x8d\xe0\xae\x9f\xe0\xae\xbe\xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xb2\xe0\xaf\x8d \xe0\xae\xa8\xe0\xaf\x86\xe0\xae\x95\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4 \xe0\xae\x9a\xe0\xaf\x80\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xa9\xe0\xaf\x8d"

它显示为不可读的混乱。如何使用实际字符显示它?

1 个答案:

答案 0 :(得分:1)

当您将\xe0\xae\xa8\xe0...之类的十六进制代码分配给一个字符串时,R不知道如何解释它们,因此它假定计算机上当前语言环境的编码。如今,在当今大多数基于Unix的现代系统上,该字符串将为UTF-8,例如,在Mac上,您的字符串显示为

> x
[1] "நடிகர் சூர்யா செய்த உதவி மிக முக்கியமானது!' - டெல்டாவில் நெகிழ்ந்த சீமான்"

我认为这是正确的显示。 Google翻译将其识别为泰米尔语。

但是,在Windows上它无法显示。在Windows 10系统上,我看到了

> x
[1] "நடிகர௠சூரà¯à®¯à®¾ செயà¯à®¤ உதவி மிக à®®à¯à®•à¯à®•à®¿à®¯à®®à®¾à®©à®¤à¯!' - டெலà¯à®Ÿ

因为它使用与Latin1编码相对应的代码页,所以该字符串不正确。为了使它在Windows上正确显示,您需要通过声明其编码来告诉R它是UTF-8编码的:

Encoding(x) <- "UTF-8"

然后它也将在Windows中正确显示,从而解决了您的问题。

对于其他尝试这样做的人,重要的是要知道只有少数几个值可以这样工作。您可以将编码声明为"UTF-8""latin1""bytes""unknown"。 “未知”表示计算机上的本地编码,“字节”表示完全不应将其解释为字符。如果您的字符串使用不同的编码,则需要使用不同的方法:转换为R知道的一种编码。

例如,字符串

x <- "\xb4\xde\xd1\xe0\xde\xd5 \xe3\xe2\xe0\xde" 

是ISO 8859-5中的俄语编码。在使用本地编码的系统上,它可以正确显示,但是在我的系统上,它使用十六进制代码显示。为了使其正确显示,我需要使用

将其转换为UTF-8
y <- iconv(x, from="ISO8859-5", to="UTF-8")

然后它将正确显示为[1] "Доброе утро"。您可以看到iconv()关于使用iconvlist()的编码的完整列表。