0

これはよくある質問ですが、信頼できない正規表現に頼らないと答えを見つけることができないようです。

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

これには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

4

2 に答える 2

2

PL/ruby を使用しているとのことでした。これは、文字列が実際には古い「エスケープ」形式byteaを使用した値 (BLOB の PostgreSQL バージョン) であることを示唆しています。エスケープ形式は、非 ASCII 値を先頭に 8 進数でエンコードするため、少し整理する必要があります。\gsubArray#pack

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

これにより、エスケープ値がs生のバイトに展開され、bytes. ただし、まだバイナリデータを扱っているため、コンソールに表示しようとしても、必ずしも役立つとは限りません。理解しやすい文字列を扱っていることがわかっている場合は、文字列のエンコーディングを把握し、Stringメソッドを使用してエンコーディングを整理する必要があります。

于 2012-05-14T02:13:20.627 に答える
1

.to_sおそらく、代わりに使用したいだけですか?

于 2012-05-13T23:56:16.317 に答える