Răsfoiți Sursa

Merge pull request #2765 from mandel59/bytes-utf8-utf16-bug

fix haxe.io.Bytes#ofString and toString
Nicolas Cannasse 11 ani în urmă
părinte
comite
1c809fb508
1 a modificat fișierele cu 12 adăugiri și 5 ștergeri
  1. 12 5
      std/haxe/io/Bytes.hx

+ 12 - 5
std/haxe/io/Bytes.hx

@@ -204,7 +204,7 @@ class Bytes {
 		var fcc = String.fromCharCode;
 		var i = pos;
 		var max = pos+len;
-		// utf8-encode
+		// utf8-decode and utf16-encode
 		while( i < max ) {
 			var c = b[i++];
 			if( c < 0x80 ) {
@@ -218,7 +218,10 @@ class Bytes {
 			} else {
 				var c2 = b[i++];
 				var c3 = b[i++];
-				s += fcc( ((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (b[i++] & 0x7F) );
+				var u = ((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 & 0x7F) << 6) | (b[i++] & 0x7F);
+				// surrogate pair
+				s += fcc( (u >> 10) + 0xD7C0 );
+				s += fcc( (u & 0x3FF) | 0xDC00 );
 			}
 		}
 		return s;
@@ -315,9 +318,13 @@ class Bytes {
 		catch (e:Dynamic) throw e;
 		#else
 		var a = new Array();
-		// utf8-decode
-		for( i in 0...s.length ) {
-			var c : Int = StringTools.fastCodeAt(s,i);
+		// utf16-decode and utf8-encode
+		var i = 0;
+		while( i < s.length ) {
+			var c : Int = StringTools.fastCodeAt(s,i++);
+			// surrogate pair
+			if( 0xD800 <= c && c <= 0xDBFF )
+			       c = (c - 0xD7C0 << 10) | (StringTools.fastCodeAt(s,i++) & 0x3FF);
 			if( c <= 0x7F )
 				a.push(c);
 			else if( c <= 0x7FF ) {