将 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) &lt;- "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 转换为可读字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为可读流?

将 unsigned char* 转换为可读字符串 & 这个函数在做啥

改进将字符串转换为可读 url

如何将智能合约返回的地址转换为可读字符串?

如何将八位字节字符串转换为可读字符串[重复]

如何在 Swift 中将多字符数字格式转换为可读的字符串?