diff options
author | Charles Oliver Nutter <headius@headius.com> | 2015-08-21 16:09:55 -0500 |
---|---|---|
committer | Charles Oliver Nutter <headius@headius.com> | 2015-08-21 16:09:55 -0500 |
commit | 897ca0020f84f1b90451019c97406fde01e1a20c (patch) | |
tree | 1114910b0185687796762b76ce05e3d66acac945 /ext | |
parent | 70ac6ea2d70ca643dd539e7eb44fe47ec277906e (diff) | |
download | psych-897ca0020f84f1b90451019c97406fde01e1a20c.zip |
If incoming string is not unicode, transcode to UTF-8.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/java/PsychParser.java | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/ext/java/PsychParser.java b/ext/java/PsychParser.java index ac78d88..c8f25a0 100644 --- a/ext/java/PsychParser.java +++ b/ext/java/PsychParser.java @@ -52,6 +52,7 @@ import org.jruby.runtime.ObjectAllocator; import org.jruby.runtime.ThreadContext; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.util.IOInputStream; +import org.jruby.util.io.EncodingUtils; import org.jruby.util.log.Logger; import org.jruby.util.log.LoggerFactory; import org.yaml.snakeyaml.DumperOptions; @@ -135,14 +136,20 @@ public class PsychParser extends RubyObject { Ruby runtime = context.runtime; if (yaml instanceof RubyString) { - Encoding enc = ((RubyString)yaml).getEncoding(); - if (!(enc instanceof UnicodeEncoding)) enc = UTF8Encoding.INSTANCE; - ByteList byteList = ((RubyString)yaml).getByteList(); + Encoding enc = byteList.getEncoding(); + + // if not unicode, transcode to UTF8 + if (!(enc instanceof UnicodeEncoding)) { + byteList = EncodingUtils.strConvEnc(context, byteList, enc, UTF8Encoding.INSTANCE); + enc = UTF8Encoding.INSTANCE; + } + ByteArrayInputStream bais = new ByteArrayInputStream(byteList.getUnsafeBytes(), byteList.getBegin(), byteList.getRealSize()); Charset charset = enc.getCharset(); - if (charset == null) charset = Charset.defaultCharset(); + + assert charset != null : "charset for encoding " + enc + " should not be null"; InputStreamReader isr = new InputStreamReader(bais, charset); |