php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #53946
Patch json_unescaped_unicode revision 2011-08-29 14:04 UTC by gwynne@php.net
revision 2011-08-29 12:57 UTC by gwynne@php.net
revision 2011-07-19 16:01 UTC by irker@php.net
Patch json_encode_doc.patch revision 2011-08-29 09:01 UTC by irker@php.net
revision 2011-08-29 08:59 UTC by irker@php.net
Patch bug53946.phpt revision 2011-07-25 06:18 UTC by irker@php.net
revision 2011-07-19 16:02 UTC by irker@php.net
Patch json_unescaped_unicode.patch revision 2011-07-19 16:02 UTC by irker@php.net

Patch json_unescaped_unicode.patch for JSON related Bug #53946

Patch version 2011-07-19 16:02 UTC

Return to Bug #53946 | Download this patch
This patch is obsolete

Obsoleted by patches:

This patch renders other patches obsolete

Obsolete patches:

Patch Revisions:

Developer: irker@php.net

Index: ext/json/php_json.h
===================================================================
--- ext/json/php_json.h	(revision 306938)
+++ ext/json/php_json.h	(working copy)
@@ -62,6 +62,7 @@
 #define PHP_JSON_NUMERIC_CHECK	(1<<5)
 #define PHP_JSON_UNESCAPED_SLASHES	(1<<6)
 #define PHP_JSON_PRETTY_PRINT	(1<<7)
+#define PHP_JSON_UNESCAPED_UNICODE	(1<<8)
 
 /* Internal flags */
 #define PHP_JSON_OUTPUT_ARRAY	0


Index: ext/json/json.c
===================================================================
--- ext/json/json.c	(revision 311708)
+++ ext/json/json.c	(working copy)
@@ -95,6 +95,7 @@
 	REGISTER_LONG_CONSTANT("JSON_NUMERIC_CHECK", PHP_JSON_NUMERIC_CHECK, CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("JSON_UNESCAPED_SLASHES", PHP_JSON_UNESCAPED_SLASHES, CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("JSON_PRETTY_PRINT", PHP_JSON_PRETTY_PRINT, CONST_CS | CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("JSON_UNESCAPED_UNICODE", PHP_JSON_UNESCAPED_UNICODE, CONST_CS | CONST_PERSISTENT);
 
 	REGISTER_LONG_CONSTANT("JSON_ERROR_NONE", PHP_JSON_ERROR_NONE, CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("JSON_ERROR_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT);
@@ -347,6 +348,7 @@
 static void json_escape_string(smart_str *buf, char *s, int len, int options TSRMLS_DC) /* {{{ */
 {
 	int pos = 0;
+	int lenutf;
 	unsigned short us;
 	unsigned short *utf16;
 
@@ -381,6 +383,7 @@
 
 	utf16 = (unsigned short *) safe_emalloc(len, sizeof(unsigned short), 0);
 
+	if (options & PHP_JSON_UNESCAPED_UNICODE) lenutf = len;
 	len = utf8_to_utf16(utf16, s, len);
 	if (len <= 0) {
 		if (utf16) {
@@ -397,12 +400,13 @@
 		}
 		return;
 	}
+	if (options & PHP_JSON_UNESCAPED_UNICODE) len = lenutf;
 
 	smart_str_appendc(buf, '"');
 
 	while (pos < len)
 	{
-		us = utf16[pos++];
+		us = (options & PHP_JSON_UNESCAPED_UNICODE) ? s[pos++] : utf16[pos++];
 
 		switch (us)
 		{
@@ -479,7 +483,7 @@
 				break;
 
 			default:
-				if (us >= ' ' && (us & 127) == us) {
+				if (us >= ' ' && ((options & PHP_JSON_UNESCAPED_UNICODE) || (us & 127) == us)) {
 					smart_str_appendc(buf, (unsigned char) us);
 				} else {
 					smart_str_appendl(buf, "\\u", 2);
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 14:01:29 2024 UTC