Respect supplementary characters
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a64cdb8..77e149f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,9 @@
</properties>
<body>
<release version="1.10-SNAPSHOT" date="in Mercurial" description="Development">
+ <action dev="py4fun" type="fix" issue="137">
+ Respect supplementary characters (2012-01-06)
+ </action>
<action dev="py4fun" type="add">
Add a test for issue 136 (2011-12-14)
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java b/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
index 47e69c3..6e10b7d 100644
--- a/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
+++ b/src/main/java/org/yaml/snakeyaml/scanner/ScannerImpl.java
@@ -1503,7 +1503,8 @@
+ " hexadecimal numbers, but found: " + hex,
reader.getMark());
}
- char unicode = (char) Integer.parseInt(hex, 16);
+ int decimal = Integer.parseInt(hex, 16);
+ String unicode = new String(Character.toChars(decimal));
chunks.append(unicode);
reader.forward(length);
} else if (scanLineBreak().length() != 0) {
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue137/SupplementaryCharactersTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue137/SupplementaryCharactersTest.java
index 43bc278..2b6fbbd 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue137/SupplementaryCharactersTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue137/SupplementaryCharactersTest.java
@@ -20,20 +20,36 @@
import org.yaml.snakeyaml.Yaml;
+/**
+ * http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
+ */
public class SupplementaryCharactersTest extends TestCase {
- public void testSupplementaryCharacter() {
- Yaml yaml = new Yaml();
- String parsed = (String) yaml.load("\"\\U0001f648\"");
- // assertEquals(2, parsed.length());
- assertEquals("\ud83d\ude48", parsed);
- // System.out.println(data);
- }
+ public void testSupplementaryCharacter() {
+ Yaml yaml = new Yaml();
+ String parsed = (String) yaml.load("\"\\U0001f648\"");
+ assertEquals("\ud83d\ude48", parsed);
+ // System.out.println(data);
+ }
- public void testBasicMultilingualPlane() {
- Yaml yaml = new Yaml();
- String parsed = (String) yaml.load("\"\\U00000041\"");
- assertEquals("A", parsed);
- // System.out.println(data);
- }
+ public void testBasicMultilingualPlane() {
+ Yaml yaml = new Yaml();
+ String parsed = (String) yaml.load("\"\\U00000041\"");
+ assertEquals("A", parsed);
+ }
+
+ public void testDumpSupplementaryCharacter() {
+ Yaml yaml = new Yaml();
+ String output = yaml.dump("\ud83d\ude48");
+ assertEquals("\"\ud83d\ude48\"\n", output);
+ }
+
+ public void testLoadSupplementaryCharacter() {
+ try {
+ new Yaml().load("\"\ud83d\ude48\"\n");
+ fail("Are Supplementary Characters printable ?");
+ } catch (Exception e) {
+ assertEquals("special characters are not allowed", e.getMessage());
+ }
+ }
}