njs + json + \uXXXX

Andrey Oktyabrskiy ano на bestmx.net
Чт Фев 14 21:13:19 UTC 2019


On 14.02.2019 22:41, Artem S. Povalyukhin wrote:
> 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 👍'
Спасибо.

Смайликов точно не будет. Только печатные символы.


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