# File lib/active_support/multibyte/handlers/utf8_handler.rb, line 156
      def []=(str, *args)
        replace_by = args.pop
        # Indexed replace with regular expressions already works
        return str[*args] = replace_by if args.first.is_a?(Regexp)
        result = u_unpack(str)
        if args[0].is_a?(Fixnum)
          raise IndexError, "index #{args[0]} out of string" if args[0] >= result.length
          min = args[0]
          max = args[1].nil? ? min : (min + args[1] - 1)
          range = Range.new(min, max)
          replace_by = [replace_by].pack('U') if replace_by.is_a?(Fixnum)
        elsif args.first.is_a?(Range)
          raise RangeError, "#{args[0]} out of range" if args[0].min >= result.length
          range = args[0]
        else
          needle = args[0].to_s
          min = index(str, needle)
          max = min + length(needle) - 1
          range = Range.new(min, max)
        end
        result[range] = u_unpack(replace_by)
        str.replace(result.pack('U*'))
      end