2011-07-26 17 views
2

これは非常に簡単だと確信していますが、これらすべてのバックスラッシュで結びついています。ルビー文字列の文字エンコーディングを修正するバックスラッシュを追加する

ウェブサイトから(丁寧に)私が掻き集めているデータがあります。時折、次のような文章が私に届きます。

u00a362 000? you must be joking 

もちろん、「2 000?冗談じゃないわ'。 irbの短いテストで解読されました。

ruby-1.9.2-p180 :001 > string = "u00a3" 
    => "u00a3" 
ruby-1.9.2-p180 :002 > string = "\u00a3" 
    => "£" 

もちろん、バックスラッシュを追加するとデコードされます。

puts str.gsub('u00', '\\u00') 

\u00a3出力されるの結果:私はthis questionの助けを借りて、以下を作成しました。これはすべてうまいですが、文字列自体に£を入れたいと思います。ちょうどputsそれだけでは不十分です。

gsub('u00a3', '£')他の文字は間違いないと思いますので、私は行方不明です。

ありがとうございました。

答えて

0

警告、次は本当にかわいいわけではありません。

str = "u00a362 000? you must be joking" 
split_unicode = str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/) 
final = split_unicode.map do |elem| 
    if elem =~ /^u00/ 
    [("0x" + elem.gsub(/u00/, '')).hex].pack("U*") 
    else 
    elem 
    end 
end 
puts final.join 

ので、ここでの考え方はu00xx値を検索し、進に変換することです。そこから、packメソッドを使用して、正しいUnicode文字を出力することができます。

恐ろしい1ライナーで傷つけることもできます!

puts (str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/).map {|elem| elem =~ /^u00/ ? [("0x" + elem.gsub(/u00/, '')).hex].pack("U*") : elem}).join 

もっと良い解決策があるかもしれませんが、これはうまくいきます。

+0

おはよう、ありがとうございます。私の最初のブラシは「パック」です。あなたのマップ内の角括弧で何をしているのか分かりません。私がirbで動かすと、次のようになります: '£62 000?あなたは冗談を言わなければならない - その迷子はどこから来たのか? – djb

+0

'Array#pack(" U * ")'は通常、文字列のすべての文字を取り、そのユニコードビットの値を配列に格納する 'String#unpack(" U * ")'と結合されています。したがって、たとえ1つの価値があっても、パックを配列で提供する必要があります。どこから出てくる「Â」に関しては、わかりません。それは私のためにうまく動作します... – Vache

+0

OK - 私は 'Â'は別の問題だと思います - いつでもどこでも'£ 'を置くので、それはどこかから来ています。これは私の問題を解決します。ご協力いただきありがとうございます。 – djb

0

着信文字列を変換するためのIconvライブラリをお試しください。また、stringex gemを見てみることもできます。それは "他の方法"に行くメソッドがありますが、あなたが探しているマッピングを提供するかもしれません。それはあなたが悪いエンコーディングを持っているなら、それを正しくすることは不可能かもしれないと言いました。

関連する問題