# HG changeset patch # User aefimov # Date 1427716497 -10800 # Node ID e69895779fa3cada868eb7a6530c3c60a600959d # Parent deeb56c778acd60dee277cf25b0b376989e27ac7 8074297: substring in XSLT returns wrong character if string contains supplementary chars Reviewed-by: joehw diff -r deeb56c778ac -r e69895779fa3 jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Tue Mar 24 21:11:48 2015 -0700 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Mon Mar 30 14:54:57 2015 +0300 @@ -270,7 +270,7 @@ if (Double.isNaN(start)) return(EMPTYSTRING); - final int strlen = value.length(); + final int strlen = getStringLength(value); int istart = (int)Math.round(start) - 1; if (istart > strlen) @@ -278,6 +278,7 @@ if (istart < 1) istart = 0; try { + istart = value.offsetByCodePoints(0, istart); return value.substring(istart); } catch (IndexOutOfBoundsException e) { runTimeError(RUN_TIME_INTERNAL_ERR, "substring()"); @@ -297,13 +298,14 @@ return(EMPTYSTRING); int istart = (int)Math.round(start) - 1; + final int ilength = (int)Math.round(length); final int isum; if (Double.isInfinite(length)) isum = Integer.MAX_VALUE; else - isum = istart + (int)Math.round(length); + isum = istart + ilength; - final int strlen = value.length(); + final int strlen = getStringLength(value); if (isum < 0 || istart > strlen) return(EMPTYSTRING); @@ -311,10 +313,13 @@ istart = 0; try { - if (isum > strlen) + istart = value.offsetByCodePoints(0, istart); + if (isum > strlen) { return value.substring(istart); - else - return value.substring(istart, isum); + } else { + int offset = value.offsetByCodePoints(istart, ilength); + return value.substring(istart, offset); + } } catch (IndexOutOfBoundsException e) { runTimeError(RUN_TIME_INTERNAL_ERR, "substring()"); return null;