2012-12-10 169 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