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