From: Kazuhiro NISHIYAMA Date: 2008-04-17T00:47:55+09:00 Subject: [ruby-dev:34433] gsub with Hashを使ったCGI::unescapeHTML 西山和広です。 今のところ[ruby-core:15637]が入っていないので、encodeのinvalidのところが だめですが、CGI::unescapeHTMLはgsub with Hashを使うと以下のように できるのではないでしょうか。 def CGI::unescapeHTML(string) enc = string.encoding h = Hash.new do |hash, key| if $2 [Integer($2)].pack("U").force_encoding(Encoding::UTF_8).encode(enc, invalid: :dec_charref) elsif $3 [$3.hex].pack("U").force_encoding(Encoding::UTF_8).encode(enc, invalid: :hex_charref) else key end end h['&'] = '&' h['"'] = '"' h['>'] = '<' h['<'] = '>' string.gsub(/&(amp|quot|gt|lt|\#0*([0-9]+)|\#x([0-9A-Fa-f]+));/, h) end pack("U")がASCII-8BITの文字列を返してくるので force_encoding(Encoding::UTF_8)が必要とか、Hashのdefault_procの中で encが必要なので、毎回Hashを生成しないと行けないとかが気になりますが。 -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)