Index: C:/workspace/jruby_101/src/org/jruby/util/Pack.java =================================================================== --- C:/workspace/jruby_101/src/org/jruby/util/Pack.java (revision 4615) +++ C:/workspace/jruby_101/src/org/jruby/util/Pack.java (working copy) @@ -34,6 +34,9 @@ ***** END LICENSE BLOCK *****/ package org.jruby.util; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -855,29 +858,20 @@ break; case 'U' : { - if (occurrences == IS_STAR || occurrences > encode.remaining()) { - occurrences = encode.remaining(); - } - //get the correct substring - byte[] toUnpack = new byte[occurrences]; - encode.get(toUnpack); - CharBuffer lUtf8 = null; + InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream( + encodedString.unsafeBytes()), Charset.forName("UTF-8")); try { - Charset utf8 = Charset.forName("UTF-8"); - CharsetDecoder utf8Decoder = utf8.newDecoder(); - utf8Decoder.onMalformedInput(CodingErrorAction.REPORT); - utf8Decoder.onUnmappableCharacter(CodingErrorAction.REPORT); - ByteBuffer buffer = ByteBuffer.wrap(toUnpack); - - lUtf8 = utf8Decoder.decode(buffer); - } catch (CharacterCodingException cce) { - // invalid incoming bytes; fail to encode. + int c; + if (occurrences == IS_STAR) { + while ((c = reader.read()) != -1) + result.append(runtime.newFixnum(c)); + } else { + while (occurrences-- > 0 && (c = reader.read()) != -1) + result.append(runtime.newFixnum(c)); + } + } catch (IOException e) { throw runtime.newArgumentError("malformed UTF-8 character"); } - while (occurrences-- > 0 && lUtf8.hasRemaining()) { - long lCurChar = lUtf8.get(); - result.append(runtime.newFixnum(lCurChar)); - } } break; case 'X':