diff --git a/Src/JSON.ahk b/Src/JSON.ahk index 98d9214..2942483 100644 --- a/Src/JSON.ahk +++ b/Src/JSON.ahk @@ -19,6 +19,22 @@ class JSON } } + EscapeUnicode[] + { + get + { + this._init() + return NumGet(this.lib.bEscapeUnicode, "Int") + } + + set + { + this._init() + NumPut(value, this.lib.bEscapeUnicode, "Int") + return value + } + } + _init() { if (this.lib) diff --git a/Src/dumps.c b/Src/dumps.c index 1966769..01681c4 100644 --- a/Src/dumps.c +++ b/Src/dumps.c @@ -239,8 +239,11 @@ int write_escaped(LPTSTR pt, LPTSTR *ppszString, DWORD *pcchString) write('\\'); write('t'); } - else if (*pt < ' ' || *pt > '~') // outside printable ascii - { + else if ( + bEscapeUnicode + ? ((unsigned short)*pt < ' ' ||(unsigned short)*pt > '~') // Outside printable ascii + : ((unsigned short)*pt < ' ' || ((unsigned short)*pt > '~' && (unsigned short)*pt < 0xA1)) // Outside printable ascii, allowing Unicode passthrough + ) { write('\\'); write('u'); write_hex_uint16(*pt, ppszString, pcchString); diff --git a/Src/shared.h b/Src/shared.h index ff7f7fe..07a385d 100644 --- a/Src/shared.h +++ b/Src/shared.h @@ -25,4 +25,7 @@ MCL_EXPORT_GLOBAL(fnGetObj); static bool bBoolsAsInts = true; MCL_EXPORT_GLOBAL(bBoolsAsInts); +static bool bEscapeUnicode = true; +MCL_EXPORT_GLOBAL(bEscapeUnicode); + #endif \ No newline at end of file diff --git a/Tests/DumpsTestSuite.ahk b/Tests/DumpsTestSuite.ahk index ce36742..c674f0b 100644 --- a/Tests/DumpsTestSuite.ahk +++ b/Tests/DumpsTestSuite.ahk @@ -112,6 +112,14 @@ class DumpsTestSuite Yunit.assert(produced == expected, Format(this.message, expected, produced)) } + Test_Escape_Unicode() + { + JSON.EscapeUnicode := False + expected = ["πŸ“ŽπŸŸπŸ’πŸ€πŸ”ΌπŸ‘πŸ‘“ πŸ©πŸŒ…πŸŒ³πŸ”πŸ©πŸŽ πŸ“΅πŸ­πŸŒ–πŸ” πŸš"] + produced := JSON.Dump(["πŸ“ŽπŸŸπŸ’πŸ€πŸ”ΌπŸ‘πŸ‘“ πŸ©πŸŒ…πŸŒ³πŸ”πŸ©πŸŽ πŸ“΅πŸ­πŸŒ–πŸ” πŸš"]) + Yunit.assert(produced == expected, Format(this.message, expected, produced)) + } + Test_Big_Numbers() { if (A_PtrSize == 4)