src/Pure/System/utf8.scala
changeset 64617 01e50039edc9
parent 64615 fd0d6de380c6
equal deleted inserted replaced
64616:dc3ec40fe41b 64617:01e50039edc9
    19   val charset: Charset = Charset.forName(charset_name)
    19   val charset: Charset = Charset.forName(charset_name)
    20   def codec(): Codec = Codec(charset)
    20   def codec(): Codec = Codec(charset)
    21 
    21 
    22   def bytes(s: String): Array[Byte] = s.getBytes(charset)
    22   def bytes(s: String): Array[Byte] = s.getBytes(charset)
    23 
    23 
    24   def bytes_length(s: String): Int =
    24   object Length extends Codepoint.Length
    25     (0 /: Codepoint.iterator(s)) {
    25   {
    26       case (n, i) =>
    26     override def codepoint_length(c: Int): Int =
    27         if (i < 0x80) n + 1
    27       if (c < 0x80) 1
    28         else if (i < 0x800) n + 2
    28       else if (c < 0x800) 2
    29         else if (i < 0x10000) n + 3
    29       else if (c < 0x10000) 3
    30         else n + 4
    30       else 4
    31     }
    31   }
    32 
       
    33   object Length extends Line.Length { def apply(s: String): Int = bytes_length(s) }
       
    34 
    32 
    35 
    33 
    36   /* permissive UTF-8 decoding */
    34   /* permissive UTF-8 decoding */
    37 
    35 
    38   // see also http://en.wikipedia.org/wiki/UTF-8#Description
    36   // see also http://en.wikipedia.org/wiki/UTF-8#Description
    97   {
    95   {
    98     require(0 <= start && start <= end && end <= buffer.length)
    96     require(0 <= start && start <= end && end <= buffer.length)
    99     new Decode_Chars(decode, buffer, start, end)
    97     new Decode_Chars(decode, buffer, start, end)
   100   }
    98   }
   101 }
    99 }
   102