Chris@441: require 'iconv' Chris@441: Chris@441: module Redmine Chris@441: module CodesetUtil Chris@441: Chris@441: def self.replace_invalid_utf8(str) Chris@441: return str if str.nil? Chris@441: if str.respond_to?(:force_encoding) Chris@441: str.force_encoding('UTF-8') Chris@441: if ! str.valid_encoding? Chris@441: str = str.encode("US-ASCII", :invalid => :replace, Chris@441: :undef => :replace, :replace => '?').encode("UTF-8") Chris@441: end Chris@441: else Chris@441: ic = Iconv.new('UTF-8', 'UTF-8') Chris@441: txtar = "" Chris@441: begin Chris@441: txtar += ic.iconv(str) Chris@441: rescue Iconv::IllegalSequence Chris@441: txtar += $!.success Chris@441: str = '?' + $!.failed[1,$!.failed.length] Chris@441: retry Chris@441: rescue Chris@441: txtar += $!.success Chris@441: end Chris@441: str = txtar Chris@441: end Chris@441: str Chris@441: end Chris@441: end Chris@441: end