瀏覽代碼

added utf8 string support.

Nicolas Cannasse 19 年之前
父節點
當前提交
4963f53d03
共有 2 個文件被更改,包括 75 次插入10 次删除
  1. 35 1
      std/haxe/Serializer.hx
  2. 40 9
      std/haxe/Unserializer.hx

+ 35 - 1
std/haxe/Serializer.hx

@@ -50,6 +50,7 @@ class Serializer {
 		m : -Inf
 		p : +Inf
 		s : string
+		j : utf8 string
 		a : array
 		u : array nulls
 		h : array end
@@ -60,10 +61,43 @@ class Serializer {
 		w : enum
 	*/
 
+	public function bytes(s : String) {
+		#if neko
+		return s.length;
+		#else true
+		var b = s.length;
+		for( i in 0...s.length ) {
+			var c = s.charCodeAt(i);
+			if( c < 0x7F )
+				continue;
+			if( c < 0x7FF ) {
+				b++;
+				continue;
+			}
+			if( c < 0xFFFF ) {
+				b += 2;
+				continue;
+			}
+			b += 3;
+		}
+		return b;
+		#end
+	}
+
 	function serializeString( s : String ) {
 		if( serializeRef(s) )
 			return;
-		s = s.split("\\").join("\\\\").split("\n").join("\\n").split("\r").join("\\r").split("\"").join("\\\"");
+		for( i in 0...s.length ) {
+			var c = s.charCodeAt(i);
+			if( c > 0x7F || c == 13 || c == 10 ) {
+				s = s.split("\\").join("\\\\").split("\n").join("\\n").split("\r").join("\\r");
+				buf.add("j");
+				buf.add(bytes(s));
+				buf.add(":");
+				buf.add(s);
+				return;
+			}
+		}
 		buf.add("s");
 		buf.add(s.length);
 		buf.add(":");

+ 40 - 9
std/haxe/Unserializer.hx

@@ -114,15 +114,46 @@ class Unserializer {
  			return Math.POSITIVE_INFINITY;
  		case 115: // s
  			var len = readDigits();
- 			if( buf.charAt(pos++) == ":" ) {
- 				if( length - pos < len )
- 					throw "Invalid string length";
- 				var s = buf.substr(pos,len);
- 				pos += len;
- 				s = s.split("\\\"").join("\"").split("\\r").join("\r").split("\\n").join("\n").split("\\\\").join("\\");
- 				cache.push(s);
- 				return s;
- 			}
+ 			if( buf.charAt(pos++) != ":" || length - pos < len )
+				throw "Invalid string length";
+ 			var s = buf.substr(pos,len);
+ 			pos += len;
+			cache.push(s);
+			return s;
+ 		case 106: // j
+ 			var len = readDigits();
+ 			if( buf.charAt(pos++) != ":" )
+ 				throw "Invalid string length";
+ 			#if neko
+			if( length - pos < len )
+				throw "Invalid string length";
+ 			var s = buf.substr(pos,len);
+ 			pos += len;
+ 			#else true
+ 			var old = pos;
+ 			var max = pos + len;
+ 			while( pos < max ) {
+				var c = buf.charCodeAt(pos++);
+				if( c < 0x7F )
+					continue;
+				if( c < 0x7FF ) {
+					max--;
+					continue;
+				}
+				if( c < 0xFFFF ) {
+					max -= 2;
+					continue;
+				}
+				max -= 3;
+			}
+			len = max - old;
+			if( pos != max || length - old < len )
+				throw "Invalid string length";
+			var s = buf.substr(old,len);
+ 			#end
+ 			s = s.split("\\r").join("\r").split("\\n").join("\n").split("\\\\").join("\\");
+ 			cache.push(s);
+ 			return s;
  		case 97: // a
  			var a = new Array<Dynamic>();
  			cache.push(a);