From: Clément DAVID Date: Wed, 18 Nov 2015 16:55:09 +0000 (+0100) Subject: Xcos writers: fix ScilabString encoding X-Git-Tag: 6.0.0-beta-1~220 X-Git-Url: http://gitweb.scilab.org/?p=scilab.git;a=commitdiff_plain;h=c08d1f0d0f6d1147f4983cff6797a0574e87e9b9 Xcos writers: fix ScilabString encoding Change-Id: I1509fe9f9e3319a008f5adbe5e527e400b9412a5 --- diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java index 604eba1..6fe1456 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java @@ -12,7 +12,6 @@ package org.scilab.modules.xcos.io; -import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.DoubleBuffer; import java.nio.IntBuffer; @@ -91,6 +90,7 @@ public class ScilabTypeCoder { VectorOfDouble vec = new VectorOfDouble(); encode(value, vec); + // System.err.println("var2vec:" + var.toString() + ":" + toString(vec)); if (LOG.isLoggable(Level.FINE)) { LOG.fine("var2vec:" + var.toString() + ":" + toString(vec)); } @@ -359,6 +359,7 @@ public class ScilabTypeCoder { ScilabType var = decodeHeader(vec); decode(vec, var); + // System.err.println("vec2var:" + toString(vec) + ":" + var.toString()); if (LOG.isLoggable(Level.FINE)) { LOG.fine("vec2var:" + toString(vec) + ":" + var.toString()); } @@ -507,21 +508,27 @@ public class ScilabTypeCoder { } // reconstruct each String object - try { - for (int i = 0; i < var.getHeight(); i++) { - for (int j = 0; j < var.getWidth(); j++) { - ByteBuffer view = vec.asByteBuffer(position, offset[i][j]); - byte[] bytes = new byte[offset[i][j] * Double.BYTES]; + Charset utf8 = Charset.forName("UTF-8"); + for (int i = 0; i < var.getHeight(); i++) { + for (int j = 0; j < var.getWidth(); j++) { + ByteBuffer view = vec.asByteBuffer(position, offset[i][j]); + byte[] bytes = new byte[offset[i][j] * Double.BYTES]; - view.get(bytes); - data[i][j] = new String(bytes, "UTF-8"); + view.get(bytes); - position += offset[i][j]; - } + // to avoid mis-decoding we have to look for the strlen of bytes + int length = 0; + for (; length < bytes.length; length++) + if (bytes[length] == 0) { + break; + } + + data[i][j] = new String(bytes, 0, length, utf8); + + position += offset[i][j]; } - } catch (UnsupportedEncodingException e) { - // ignore as UTF-8 is always available } + return var; } diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/RawDataWriter.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/RawDataWriter.java index bb66957..bcf9bff 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/RawDataWriter.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/RawDataWriter.java @@ -16,7 +16,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map.Entry; import java.util.logging.Level; -import java.util.logging.Logger; import javax.xml.stream.XMLStreamException;