njs + json + \uXXXX

Artem S. Povalyukhin artem.povaluhin на gmail.com
Чт Фев 14 19:41:39 UTC 2019


Hi!

On 2/14/19 5:57 PM, Andrey Oktyabrskiy wrote:
> Возможно ли в NJS получить строку
> {"text":"\u0431\u0435\u043b\u0438\u0431\u0435\u0440\u0434\u0430"}
> 
> из такого JSON'a
> {"text":"белиберда"}
> 
> JSON.parse прекрасно распознаёт такой JSON, а вот обратное
> преобразование как сделать, не соображу никак.
> 

Ввиду особенностей работы njs со строками, немного не тривиально
(для случая наличия смайликов в тексте и тп):

$ cat unicode.js
// @see http://www.json.org/JSON_checker/utf8_to_utf16.c
var u8 = '\\u0444\\u044b\\u0432\\u0430 asdf \\ud83d\\udc4d';
var a16 = [];
var enc = function(c) {
        return '\\u' + c.toString(16).padStart(4, '0');
};

for (var i = 0; i < u8.length; ++i) {
        var c = u8.codePointAt(i);
        if (c < 0x7f) {
                a16.push(u8[i]);
        } else if (c < 0x10000) {
                a16.push(enc(c));
        } else {
                c -= 0x10000;
                a16.push(enc(0xd800 | (c >> 10)));
                a16.push(enc(0xdc00 | (c & 0x3ff)));
        }
}

var u16 = a16.join('');

console.log('encoded: ', u16);
console.log('parsed: ', JSON.parse('"' + u16 + '"'));

$ njs unicode.js
'encoded: ' '\\u0444\\u044b\\u0432\\u0430 asdf \\ud83d\\udc4d'
'parsed: ' 'фыва asdf 👍'

wbr,
Artem


Подробная информация о списке рассылки nginx-ru