Ruby六进制代码到unicode的转换

Ruby六进制代码到unicode的转换,ruby,unicode,Ruby,Unicode,我抓取了一个包含unicode的网站,结果看起来像是,如果是代码的话 a=“\\u2665\\uc624\\ube60!\\uc8fd\\uae30\\uc804\\uc5d0” 我可以知道如何在Ruby中将其转换回UTF-8格式的原始Unicode文本吗?如果您有Ruby 1.9,您可以尝试: a.force_encoding('UTF-8') 否则,如果您有

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

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


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

如果您有Ruby 1.9,您可以尝试:

a.force_encoding('UTF-8')

否则,如果您有<1.9,我建议您阅读Ruby 1.8中转换为UTF-8的内容。

简短回答:您应该能够“输入a”,并看到打印出来的字符串。至少对我来说,我可以在1.8.7和1.9.2中打印出该字符串

长答覆: 第一件事:这取决于您使用的是ruby 1.8.7还是1.9.2,因为字符串和编码的处理方式发生了变化

在1.8.7中: 字符串只是字节列表。当你把它们打印出来的时候,如果你的操作系统能够处理它,你只需要“放一个”就可以了,它应该可以正常工作。如果执行[0],将得到第一个字节。如果你想得到每个角色,事情是相当棘手的

在1.9.2中
字符串是带有编码的字节列表。如果网页以正确的编码发送,则您的字符串应已正确编码。如果没有,你必须设置它(根据Mike Lewis的回答)。如果执行[0],将获得第一个字符(心脏)。如果需要每个字节,可以使用a.bytes。

您还可以在打开新的
IO
对象时指定编码:


与Mike的解决方案相比,如果您在向应用程序的其余部分公开字符串之前忘记强制编码,并且存在多种从模块或类检索字符串的机制,那么这可能会避免出现问题。但是,如果您开始对SJIS或KOI-8编码的网站进行爬网,那么Mike的解决方案将更容易适应web服务器在其标题中返回的字符编码名称。

如果您的操作系统出于任何原因为您提供了这些文字ascii字符,那么我之前的回答显然无效,请忽略它。:P

以下是您可以做的:

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

这将扫描ascii字符串“\u”,后跟一个十六进制数字,并用正确的unicode字符替换它。

出于某种原因,双反斜杠没有出现,我已经更新了帖子。我非常确定我的操作系统能够处理它,反正它是OS X Snow Leopard。当我放入a时,这就是我得到的\u2665\uc624\ube60\uc8fd\uae30\uc804\uc5d0和a.inspect给我“\”\\\\u2665\\\uc624\\\\ube60\\\\uc8fd\\\\uae30\\\\uc804\\\\uc5d0\\”“或者我应该把重点放在删除双斜杠并将其替换为单斜杠上吗?这将有助于您在原始问题中添加一小部分代码示例。显示连接到站点、检索内容、提取字符串并显示的代码。当然,您可以打印“a.bytes.to_a”。如果前几个字节是[92、117、50、54、54…,则必须转换(或以不同方式下载)ASCII数据[226、153、165、32、236…,实际上您有Unicode数据,但它的行为不正确。警告:如果您有一个字符串,其中包含一个反斜杠,后跟
u
和四个十六进制数字,您可能没有正确解析某些内容。这通常是由于试图将JSON字符串文本作为字符串处理,而不是使用使用JSON解析器创建em。