Ruby hexacode到unicode转换

时间:2011-03-17 03:09:56

标签: ruby unicode

我抓了一个包含unicode的网站,结果看起来像是在代码中

a =“\\ u2665 \\ uc624 \\ ube60!\\ uc8fd \\ uae30 \\ uc804 \\ uc5d0”

我是否知道如何在Ruby中将其转换回UTF-8格式的原始Unicode文本?

4 个答案:

答案 0 :(得分:1)

如果你有ruby 1.9,你可以尝试:

a.force_encoding('UTF-8')

否则,如果你有< 1.9,我建议在Ruby 1.8中转换为UTF-8时阅读this article

答案 1 :(得分:1)

简短的回答:你应该能够'放一个',并看到打印出来的字符串。对我来说,至少,我可以在1.8.7和1.9.2中打印出该字符串

答案很长: 第一件事:它取决于你是否使用ruby 1.8.7或1.9.2,因为处理字符串和编码的方式发生了变化。

1.8.7中的

: 字符串只是字节列表。当你打印出来时,如果你的操作系统可以处理它,你可以“放一个”它应该正常工作。如果你做[0],你将得到第一个字节。如果你想得到每一个角色,事情就变得非常棘手了。

在1.9.2中 字符串是具有编码的字节列表。如果网页使用正确的编码发送,则您的字符串应该已经正确编码。如果没有,你将不得不设置它(根据Mike Lewis的回答)。如果你做[0],你将得到第一个字符(心脏)。如果你想要每个字节,你可以做一个.bytes。

答案 2 :(得分:1)

如果您的操作系统出于某种原因正在为您提供那些字面上的ascii字符,那么我以前的答案显然无效,请忽略它。 :P

这是你可以做的:

a.gsub(/\\u([a-z0-9]+)/){|p| [$1.to_i(16)].pack("U")}

这将扫描ascii字符串'\ u'后跟十六进制数字,并将其替换为正确的unicode字符。

答案 3 :(得分:0)

您还可以在打开新的IO对象时指定编码:http://www.ruby-doc.org/core/classes/IO.html#M000889

与Mike的解决方案相比,如果您在将字符串暴露给应用程序的其余部分之前忘记强制编码,如果有多种机制可以从模块或类中检索字符串,则可以防止出现问题。但是,如果您开始抓取SJIS或KOI-8编码的网站,那么Mike的解决方案将更容易适应Web服务器在其标头中返回的字符编码名称。