2012-12-10 120 views
1

我想比较message[0]"CONNECT",但它只是失败:红宝石比较字符串

puts message[0].dump 
->"\x00C\x00O\x00N\x00N\x00E\x00C\x00T\x00" 
puts "CONNECT".dump 
->"CONNECT" 

有人可以解释我为什么?

+1

什么消息的'结果[0] .encoding'? – matt

+0

这看起来像一个UTF-16编码。你的输入流,你得到'message'的地方,可能需要定义一个字符集编码。查看['IO.new']的模式文档(http://www.ruby-doc.org/core-1.9.3/IO.html#method-cnew)作为起点,并检查它们设置编码的例子。 –

+0

消息[0]是ASCII-8BIT编码这就是为什么我得到所有这些空字符? – dionin

回答

0

消息[0]是不同的编码

试试这个message[0].encode("UTF-8", :invalid=>:replace, :replace=>"?")

如果不工作,你必须尝试不同的编码。我认为这个答案只适用于1.9。*版本。对于旧版本,我认为你必须要求iconv

+0

也许这与你的问题无关。它可能只是一个奇怪的字符之间每个字母 –

+0

谢谢,我改变了编码,但它仍然无法正常工作似乎消息[0] [0]是“\ x00”和消息[0] [1]是“C “ – dionin

2

看来你的字符串中有很多NULL字符。最好找出它们来自哪里,但只要删除它们就可以使用它。

def remove_null_chrs(str) 
    str.unpack('C*').select{|x|x != 0}.pack('C*') 
end 

例如

remove_null_chrs("\x00C\x00O\x00N\x00N\x00E\x00C\x00T\x00") 
=> "CONNECT" 
+0

它实际上可能是你的输入是UTF-16,但它会被截断,因为最后一个\ x00应该跟着另一个字符。但是为了说明:'“\ x00C \ x00O \ x00N \ x00N \ x00E \ x00C \ x00T”.force_encoding('UTF-16BE')。encode('UTF-8')#​​=>“CONNECT” –

+1

您应该编辑你的答案,而不是发表评论,如果你想添加到它。 –

+0

感谢您的诀窍! :) – dionin