2

マルチバイト文字が含まれている場合、Mongoid を使用して MongoDB にレコードを保存する際に問題があります。これは文字列です:

a="Chris \xA5\xEB\xAE\xDFe\xA5"

最初にそれを BINARY に変換してから、次gsubのようにします。

a.force_encoding("BINARY").gsub(0xA5.chr,"oo")

...うまくいきます:

=> "Chris oo\xEB\xAE\xDFeoo"

chrしかし、使用するとメソッドを使用できないようですRegexp

a.force_encoding("BINARY").gsub(/0x....?/.chr,"")
NoMethodError: undefined method `chr' for /0x....?/:Regexp

同じ問題を抱えている人はいますか?

どうもありがとう...

4

2 に答える 2

6

補間でそれを行うことができます

a.force_encoding("BINARY").gsub(/#{0xA5.chr}/,"") 

与える

"Chris \xEB\xAE\xDFe"

EDIT:コメントに基づいて、ここではバイナリエンコード文字列をASCII表現に変換し、その文字列に対して正規表現を実行するバージョン

a.unpack('A*').to_s.gsub(/\\x[A-F0-9]{2}/,"")[2..-3] #=>"Chris "

最後の [2..-3] は、最初の [" および末尾の "] を取り除くことです。

注:使用できる特殊文字を取り除くだけです

a.gsub(/\W/,"") #=> "Chris"
于 2012-06-12T11:11:30.463 に答える
4

実際の文字列にはリテラル文字\xA5が含まれていません。これは、他の方法では印刷できない文字が表示される方法です(文字列に改行ルビーが含まれている場合と同様に\ nが表示されます)。

アスキー以外のものを変更したい場合は、これを行うことができます

a="Chris \xA5\xEB\xAE\xDFe\xA5"
a.force_encoding('BINARY').encode('ASCII', :invalid => :replace, :undef => :replace, :replace => 'oo')

これは、文字列をバイナリエンコーディングに強制することから始まります(バイトがそのエンコーディングに対して有効である文字列から開始する必要があります。バイナリには任意のバイトを含めることができるため、常に有効です)。次に、ASCIIに変換します。通常、これはエラーを引き起こします。これは、何をすべきかわからない文字があるためですが、渡した追加のオプションは、無効な/未定義のシーケンスを文字「oo」に置き換えるように指示します。

于 2012-06-14T11:20:13.883 に答える