Forráskód Böngészése

Fix non-BMP characters in StringBuf (#8239)

* add tests to StringBuf unit test, fix Java StringBuf for non-bmp chars

* fix cs

* use appendCodePoint on Java

* disable test on Neko

* don't inline addChar on C#
Aurel 6 éve
szülő
commit
e7ebc78b4e

+ 7 - 2
std/cs/_std/StringBuf.hx

@@ -44,8 +44,13 @@ class StringBuf {
 		b.Append(s, pos, (len == null) ? (s.length - pos) : len);
 	}
 
-	public inline function addChar( c : Int ) : Void untyped {
-		b.Append(cast(c, cs.StdTypes.Char16));
+	public function addChar( c : Int ) : Void untyped {
+		if (c >= 0x10000) {
+			b.Append(cast((c >> 10) + 0xD7C0, cs.StdTypes.Char16));
+			b.Append(cast((c & 0x3FF) + 0xDC00, cs.StdTypes.Char16));
+		} else {
+			b.Append(cast(c, cs.StdTypes.Char16));
+		}
 	}
 
 	public inline function toString() : String {

+ 1 - 1
std/java/_std/StringBuf.hx

@@ -52,7 +52,7 @@ class StringBuf {
 	}
 
 	public function addChar( c : Int ) : Void untyped {
-		b.append(cast(c, java.StdTypes.Char16));
+		b.appendCodePoint(c);
 	}
 
 	public function toString() : String {

+ 17 - 0
tests/unit/src/unitstd/StringBuf.unit.hx

@@ -20,6 +20,23 @@ var x = new StringBuf();
 x.addSub("abcdefg", 1, 3);
 x.toString() == "bcd";
 
+// surrogate characters
+#if !(neko)
+var x = new StringBuf();
+x.add("👽");
+x.toString() == "👽";
+var x = new StringBuf();
+x.addChar(0x1F47D);
+x.toString() == "👽";
+var x = new StringBuf();
+#if utf16
+x.addSub("a👽b", 1, 2);
+#else
+x.addSub("a👽b", 1, 1);
+#end
+x.toString() == "👽";
+#end
+
 // identity
 function identityTest(s:StringBuf) {
 	return s;