2012-05-13 21 views
0

これはよくある質問ですが、信頼できない正規表現に頼らないと答えが見つからないようです。ルビーの特殊文字をエスケープする

基本的に文字列に\302\240または類似の組み合わせがある場合は、それを実際の文字に置き換えます。

私はこれにPLrubyを使用していますので、警告します。

obj = {"a"=>"some string with special chars"} 
warn obj.inspect 
NOTICE: {"Outputs"=>["a\302\240b"]} <- chars are escaped 
warn "\302\240" 
NOTICE: <-- there is a non breaking space here, like I want 
warn "#{json.inspect}" 
NOTICE: {"Outputs"=>["a\302\240"b]} <- chars are escaped 
私は文字列リテラルを使用する場合したがって、これらをデコードすることができ

が、「#{X}」フォーマット\ xxxのプレースホルダでは、文字にデコードされることはありません。

中間コマンドと同じ文字列をどのように割り当てますか?

ルビーバージョン:1.8.5

+0

あなたが何を意味するのか分かりません、ごめんなさい...多分あなたはその質問を言い換えるべきでしょう。特にコードと出力は私にとっては非常に奇妙なようです。 –

+0

私はちょうど.inspectをばかげたエスケープなしで使用したいと思います。 – Keyo

+0

組み込み型を検査する目的は、リテラルとして使用できるオブジェクトの表現を提供することです。それは "ばかげた"ことではありません。あなたはまったく違うものを探しているようです。おそらく解決策は良い考えです。 –

答えて

2

PL/ruby​​を使用しているとお伝えしました。これは、文字列がold "escape" formatを使用して実際にはbyteaの値(PostgreSQLバージョンのBLOB)であることを示しています。エスケープ形式はとてもgsubArray#packのビットはあなたを整理すべき主要な\と8進数で非ASCII値をエンコードする:生のバイトにsのエスケープ値を拡張し、bytesでそれらを残すだろう

bytes = s.gsub(/\\([0-8]{3})/) { [ $1.to_i(8) ].pack('C') } 

。あなたはまだバイナリデータを扱っていますが、コンソールに表示しようとしても、必ずしも有用なものではありません。理解可能な文字列を扱っていることがわかっている場合は、エンコーディングを把握し、Iconvを使用してエンコーディングを整理する必要があります。

+0

私が探していたもの。エスケープ形式はポストグルでうまくいきましたが、PLrubyはバックスラッシュをエスケープして\ xxxの束をテーブルに格納します。ありがとう。 – Keyo

+0

@Keyo: 'bytea'フォーマットで動作するPostgreSQLの関数があります:http://www.postgresql.org/docs/current/interactive/functions-binarystring.html#FUNCTIONS-BINARYSTRING-OTHER –

1

はおそらく、あなただけの代わりに.to_sを使いたいですか?

+0

私は具体的に、検査を返す{"a =>" b "} jsonのような出力が必要です。 to_sはまったく異なるものを使います。私はちょうど\ xxxの出現を実際の文字に置き換える方法を探しています(それをエスケープします)。 – Keyo

+0

いくつかの値を検査して検査バージョンをgsubbingしようとするのではなく、単にjsonに変換する方が理にかなっていませんか? 'require 'json'を試してください。 json = {"Outputs" => ["a \ 302 \ 240b"]} to_json; puts json' –

関連する問題