将 unicode 转换为可读字符串
Posted
技术标签:
【中文标题】将 unicode 转换为可读字符串【英文标题】:Convert unicode to a readable string 【发布时间】:2019-05-12 08:14:12 【问题描述】: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"
它显示为无法阅读的混乱。如何使用实际字符显示它?
【问题讨论】:
不知道为什么关闭,这是个好问题。该字符串实际上是 UTF-8 编码的,并且将在 Windows 上显示为垃圾,除非您使用类似Encoding(x) <- "UTF-8"
的方式声明它。如果你这样做,你会看到文本(泰米尔语,根据谷歌翻译)。
@user2554330 如果您想发布答案,它会重新打开
【参考方案1】:
当您将像\xe0\xae\xa8\xe0...
这样的十六进制代码分配给一个字符串时,R 不知道它们打算如何被解释,因此它假定您计算机上当前语言环境的编码。在当今大多数基于 Unix 的现代系统上,这将是 UTF-8,因此例如在 Mac 上,您的字符串显示为
> x
[1] "நடிகர் சூர்யா செய்த உதவி மிக முக்கியமானது!' - டெல்டாவில் நெகிழ்ந்த சீமான்"
我认为这是正确的显示。谷歌翻译识别它是用泰米尔语写的。
但是,在 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()
的完整编码列表。
【讨论】:
以上是关于将 unicode 转换为可读字符串的主要内容,如果未能解决你的问题,请参考以下文章