# File lib/rhc/vendor/okjson.rb, line 504
      def ucharcopy(t, s, i)
        n = s.length - i
        raise Utf8Error if n < 1
    
        c0 = s[i].ord
    
        # 1-byte, 7-bit sequence?
        if c0 < Utagx
          t.putc(c0)
          return 1
        end
    
        raise Utf8Error if c0 < Utag2 # unexpected continuation byte?
    
        raise Utf8Error if n < 2 # need continuation byte
        c1 = s[i+1].ord
        raise Utf8Error if c1 < Utagx || Utag2 <= c1
    
        # 2-byte, 11-bit sequence?
        if c0 < Utag3
          raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
          t.putc(c0)
          t.putc(c1)
          return 2
        end
    
        # need second continuation byte
        raise Utf8Error if n < 3
    
        c2 = s[i+2].ord
        raise Utf8Error if c2 < Utagx || Utag2 <= c2
    
        # 3-byte, 16-bit sequence?
        if c0 < Utag4
          u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
          raise Utf8Error if u <= Uchar2max
          t.putc(c0)
          t.putc(c1)
          t.putc(c2)
          return 3
        end
    
        # need third continuation byte
        raise Utf8Error if n < 4
        c3 = s[i+3].ord
        raise Utf8Error if c3 < Utagx || Utag2 <= c3
    
        # 4-byte, 21-bit sequence?
        if c0 < Utag5
          u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
          raise Utf8Error if u <= Uchar3max
          t.putc(c0)
          t.putc(c1)
          t.putc(c2)
          t.putc(c3)
          return 4
        end
    
        raise Utf8Error
      rescue Utf8Error
        t.write(Ustrerr)
        return 1
      end