Преобразовать экранированную последовательность юникода в эмодзи в JS - PullRequest
0 голосов
/ 29 марта 2020

У меня есть строка в JS следующим образом. Мне трудно преобразовать эти суррогатные пары в смайлики. Может кто-нибудь помочь?

Я пытался найти решение в Интернете, ища практически все, что мог, но тщетно.

var text = 'CONGRATS! Your task has been completed! Tell us how we did \\uD83D\\uDE4C \\uD83D\\uDC4D \\uD83D\\uDC4E'

Это код node.js. Есть ли простой способ конвертировать эти коды в эмодзи без использования внешней вспомогательной утилиты?

РЕДАКТИРОВАТЬ:

Я обновил свой код и регулярное выражение следующим образом:

var text = 'CONGRATS! Your task has been completed! Tell us how we did {2722} {1F44D} {1F44E}';

text.replace(/\{[^}]*\}/ig, (_, g) => String.fromCodePoint(`0x${g}`))

Что я делаю не так?

1 Ответ

1 голос
/ 29 марта 2020

Один из вариантов может состоять в том, чтобы заменить все escape-последовательности Unicode их HEX-представлениями и использовать String.fromCharCode(), чтобы заменить его ассоциированным символом:

const text = 'CONGRATS! Your task has been completed! Tell us how we did \\uD83D\\uDE4C \\uD83D\\uDC4D \\uD83D\\uDC4E';
const res = text.replace(/\\u([0-9A-F]{4})/ig, (_, g) => String.fromCharCode(`0x${g}`));

console.log(res);

Что касается вашего редактирования, ваша проблема связана с вашим регулярным выражением. Вы можете изменить его на /\{([^}]*)\}/g, что означает:

  1. \{ - сопоставить открытую фигурную скобку.
  2. ([^}]*) - сопоставить и group содержимое после открытой фигурной скобки, которая не является закрытой фигурной скобкой }.
  3. } - соответствует закрытой фигурной скобке.
  4. g - соответствует выражению глобально ( поэтому все вхождения выражения, а не только первое)

Полное регулярное выражение будет соответствовать {CONTENTS}, тогда как группа будет содержать только содержимое между двумя фигурными скобками, поэтому CONTENTS. Соответствие является первым аргументом, предоставляемым функции обратного вызова .replace(), тогда как группа (g) предоставляется в качестве второго аргумента и используется нами:

const text = 'CONGRATS! Your task has been completed! Tell us how we did {2722} {1F44D} {1F44E}';

const res = text.replace(/\{([^}]*)\}/g, (_, g) => String.fromCodePoint(`0x${g}`));
console.log(res);
...