rubyでシンプルなXML escape

なんでこんな基本機能知らなかったのかという感じですが、Rubyで文字列をXMLエスケープする際、

"abc<tag>def".encode(xml: :text)

でいけます。
いちいちCGIモジュールを使わなくて良いので気軽ですね。

おまけ

ついでなのでencodeメソッドに指定できるオプションでも。

undef: :replace

変換先のエンコーディングに対応文字がないとき、通常はEncoding::UndefinedConversionErrorが発生しますが、これを「?」などに置換します。

str = '鷗'
str.encode 'Shift_JIS'
#=> Encoding::UndefinedConversionError: U+9DD7 from UTF-8 to Shift_JIS

str.encode 'Shift_JIS', undef: :replace
#=> "?"

invalid: :replace

変換元の文字列に、変換元エンコーディングとして不正なバイト列があるとき、通常はEncoding::InvalidByteSequenceErrorが発生しますが、これをU+FFFD(REPLACEMENT CHARACTER)などに置換します。

str = '鷗'
str.force_encoding 'Shift_JIS'
str.encode 'UTF-8'
#=> Encoding::InvalidByteSequenceError: incomplete "\x97" on Shift_JIS

str.encode 'UTF-8', invalid: :replace
#=> "鮃�"

# replaceする文字は指定できる
str.encode 'UTF-8', invalid: :replace, replace: '?'
#=> "鮃?"

なお、�はでたらめな文字化け結果ではなくて、「そんな文字無いから置き換えたよ」という立派な意味を持つU+FFFD(REPLACEMENT CHARACTER)なのでかわいがってあげましょう。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ