On 15 February 2014 10:35, <brit...@apache.org> wrote: > Author: britter > Date: Sat Feb 15 10:35:35 2014 > New Revision: 1568612 > > URL: http://svn.apache.org/r1568612 > Log: > LANG-977: NumericEntityEscaper incorrectly encodes supplementary characters. > Thanks to Chris Karcher.
Chris isn't listed as a contributor in the POM file. Should we add him or is the "due-to" field replacing the need for that? - Duncan > > Modified: > commons/proper/lang/trunk/src/changes/changes.xml > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java > > Modified: commons/proper/lang/trunk/src/changes/changes.xml > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1568612&r1=1568611&r2=1568612&view=diff > ============================================================================== > --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original) > +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Sat Feb 15 > 10:35:35 2014 > @@ -22,6 +22,7 @@ > <body> > > <release version="3.3" date="TBA" description="Bugfix and Feature release"> > + <action issue="LANG-977" type="fix" dev="britter" due-to="Chris > Karcher">NumericEntityEscaper incorrectly encodes supplementary > characters</action> > <action issue="LANG-973" type="fix" dev="sebb">Make some private fields > final</action> > <action issue="LANG-971" type="fix" > dev="sebb">NumberUtils#isNumber(String) fails to reject invalid Octal > numbers</action> > <action issue="LANG-972" type="fix" dev="sebb">NumberUtils#isNumber does > not allow for hex 0XABCD</action> > > Modified: > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java?rev=1568612&r1=1568611&r2=1568612&view=diff > ============================================================================== > --- > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java > (original) > +++ > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java > Sat Feb 15 10:35:35 2014 > @@ -185,7 +185,7 @@ public class StringEscapeUtils { > out.write(StringUtils.replace(input.toString(), > CSV_QUOTE_STR, CSV_QUOTE_STR + CSV_QUOTE_STR)); > out.write(CSV_QUOTE); > } > - return input.length(); > + return Character.codePointCount(input, 0, input.length()); > } > } > > @@ -314,7 +314,7 @@ public class StringEscapeUtils { > > if ( input.charAt(0) != CSV_QUOTE || input.charAt(input.length() > - 1) != CSV_QUOTE ) { > out.write(input.toString()); > - return input.length(); > + return Character.codePointCount(input, 0, input.length()); > } > > // strip quotes > @@ -326,7 +326,7 @@ public class StringEscapeUtils { > } else { > out.write(input.toString()); > } > - return input.length(); > + return Character.codePointCount(input, 0, input.length()); > } > } > > > Modified: > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java?rev=1568612&r1=1568611&r2=1568612&view=diff > ============================================================================== > --- > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java > (original) > +++ > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java > Sat Feb 15 10:35:35 2014 > @@ -89,10 +89,10 @@ public abstract class CharSequenceTransl > pos+= c.length; > continue; > } > -// // contract with translators is that they have to understand > codepoints > -// // and they just took care of a surrogate pair > + // contract with translators is that they have to understand > codepoints > + // and they just took care of a surrogate pair > for (int pt = 0; pt < consumed; pt++) { > - pos += Character.charCount(Character.codePointAt(input, pt)); > + pos += Character.charCount(Character.codePointAt(input, > pos)); > } > } > } > > Modified: > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java?rev=1568612&r1=1568611&r2=1568612&view=diff > ============================================================================== > --- > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java > (original) > +++ > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java > Sat Feb 15 10:35:35 2014 > @@ -348,6 +348,9 @@ public class StringEscapeUtilsTest { > > assertEquals("Supplementary character must be represented using a > single escape", "𣎴", > escapeXml.translate("\uD84C\uDFB4")); > + > + assertEquals("Supplementary characters mixed with basic characters > should be encoded correctly", "a b c 𣎴", > + escapeXml.translate("a b c \uD84C\uDFB4")); > } > > @Test > @@ -377,6 +380,9 @@ public class StringEscapeUtilsTest { > public void testUnescapeXmlSupplementaryCharacters() { > assertEquals("Supplementary character must be represented using a > single escape", "\uD84C\uDFB4", > StringEscapeUtils.unescapeXml("𣎴") ); > + > + assertEquals("Supplementary characters mixed with basic characters > should be decoded correctly", "a b c \uD84C\uDFB4", > + StringEscapeUtils.unescapeXml("a b c 𣎴") ); > } > > // Tests issue #38569 > @@ -396,22 +402,24 @@ public class StringEscapeUtilsTest { > > @Test > public void testEscapeCsvString() throws Exception { > - assertEquals("foo.bar", > StringEscapeUtils.escapeCsv("foo.bar")); > - assertEquals("\"foo,bar\"", > StringEscapeUtils.escapeCsv("foo,bar")); > - assertEquals("\"foo\nbar\"", > StringEscapeUtils.escapeCsv("foo\nbar")); > - assertEquals("\"foo\rbar\"", > StringEscapeUtils.escapeCsv("foo\rbar")); > - assertEquals("\"foo\"\"bar\"", > StringEscapeUtils.escapeCsv("foo\"bar")); > + assertEquals("foo.bar", > StringEscapeUtils.escapeCsv("foo.bar")); > + assertEquals("\"foo,bar\"", > StringEscapeUtils.escapeCsv("foo,bar")); > + assertEquals("\"foo\nbar\"", > StringEscapeUtils.escapeCsv("foo\nbar")); > + assertEquals("\"foo\rbar\"", > StringEscapeUtils.escapeCsv("foo\rbar")); > + assertEquals("\"foo\"\"bar\"", > StringEscapeUtils.escapeCsv("foo\"bar")); > + assertEquals("foo\uD84C\uDFB4bar", > StringEscapeUtils.escapeCsv("foo\uD84C\uDFB4bar")); > assertEquals("", StringEscapeUtils.escapeCsv("")); > assertEquals(null, StringEscapeUtils.escapeCsv(null)); > } > > @Test > public void testEscapeCsvWriter() throws Exception { > - checkCsvEscapeWriter("foo.bar", "foo.bar"); > - checkCsvEscapeWriter("\"foo,bar\"", "foo,bar"); > - checkCsvEscapeWriter("\"foo\nbar\"", "foo\nbar"); > - checkCsvEscapeWriter("\"foo\rbar\"", "foo\rbar"); > - checkCsvEscapeWriter("\"foo\"\"bar\"", "foo\"bar"); > + checkCsvEscapeWriter("foo.bar", "foo.bar"); > + checkCsvEscapeWriter("\"foo,bar\"", "foo,bar"); > + checkCsvEscapeWriter("\"foo\nbar\"", "foo\nbar"); > + checkCsvEscapeWriter("\"foo\rbar\"", "foo\rbar"); > + checkCsvEscapeWriter("\"foo\"\"bar\"", "foo\"bar"); > + checkCsvEscapeWriter("foo\uD84C\uDFB4bar", "foo\uD84C\uDFB4bar"); > checkCsvEscapeWriter("", null); > checkCsvEscapeWriter("", ""); > } > @@ -428,11 +436,12 @@ public class StringEscapeUtilsTest { > > @Test > public void testUnescapeCsvString() throws Exception { > - assertEquals("foo.bar", > StringEscapeUtils.unescapeCsv("foo.bar")); > - assertEquals("foo,bar", > StringEscapeUtils.unescapeCsv("\"foo,bar\"")); > - assertEquals("foo\nbar", > StringEscapeUtils.unescapeCsv("\"foo\nbar\"")); > - assertEquals("foo\rbar", > StringEscapeUtils.unescapeCsv("\"foo\rbar\"")); > - assertEquals("foo\"bar", > StringEscapeUtils.unescapeCsv("\"foo\"\"bar\"")); > + assertEquals("foo.bar", > StringEscapeUtils.unescapeCsv("foo.bar")); > + assertEquals("foo,bar", > StringEscapeUtils.unescapeCsv("\"foo,bar\"")); > + assertEquals("foo\nbar", > StringEscapeUtils.unescapeCsv("\"foo\nbar\"")); > + assertEquals("foo\rbar", > StringEscapeUtils.unescapeCsv("\"foo\rbar\"")); > + assertEquals("foo\"bar", > StringEscapeUtils.unescapeCsv("\"foo\"\"bar\"")); > + assertEquals("foo\uD84C\uDFB4bar", > StringEscapeUtils.unescapeCsv("foo\uD84C\uDFB4bar")); > assertEquals("", StringEscapeUtils.unescapeCsv("")); > assertEquals(null, StringEscapeUtils.unescapeCsv(null)); > > @@ -441,11 +450,12 @@ public class StringEscapeUtilsTest { > > @Test > public void testUnescapeCsvWriter() throws Exception { > - checkCsvUnescapeWriter("foo.bar", "foo.bar"); > - checkCsvUnescapeWriter("foo,bar", "\"foo,bar\""); > - checkCsvUnescapeWriter("foo\nbar", "\"foo\nbar\""); > - checkCsvUnescapeWriter("foo\rbar", "\"foo\rbar\""); > - checkCsvUnescapeWriter("foo\"bar", "\"foo\"\"bar\""); > + checkCsvUnescapeWriter("foo.bar", "foo.bar"); > + checkCsvUnescapeWriter("foo,bar", "\"foo,bar\""); > + checkCsvUnescapeWriter("foo\nbar", "\"foo\nbar\""); > + checkCsvUnescapeWriter("foo\rbar", "\"foo\rbar\""); > + checkCsvUnescapeWriter("foo\"bar", "\"foo\"\"bar\""); > + checkCsvUnescapeWriter("foo\uD84C\uDFB4bar", "foo\uD84C\uDFB4bar"); > checkCsvUnescapeWriter("", null); > checkCsvUnescapeWriter("", ""); > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org