Как заменить все смайлики в строке на юникод JS - PullRequest
2 голосов
/ 26 января 2020

У меня проблема с заменой эмодзи в строке на строку с юникодом.

Например:

У меня есть строка: const str = "My string ? is with emoji ?"

Мне нужно преобразовать это строка в const str = "My string EMOJI UNICODE is with emoji EMOJI UNICODE"

эмодзи юникод должна выглядеть следующим образом: [e-1f60e]. Потому что у меня есть функция для преобразования строки с Unicode в строку с Emoji:

function convertEmoji(str) {
  return str.replace(/\[e-([0-9a-fA-F]+)\]/g, (match, hex) =>
    String.fromCodePoint(Number.parseInt(hex, 16))
  );
}

console.log(convertEmoji('string [e-1f60e] sadfsadfsadf'));  // "string ? sadfsadfsadf"

Ответы [ 3 ]

3 голосов
/ 26 января 2020

Вы можете использовать replace, как вы делаете в своей функции, идя в другую сторону. Этот ответ предоставляет регулярное выражение для современного JavaScript, которое соответствует различным диапазонам "эмодзи". Затем в обратном вызове вы можете использовать codePointAt, чтобы получить значение кодовой точки смайлика, преобразовать его в шестнадцатеричное с помощью toString(16) и вернуть строку в нужном формате:

const str = "My string ? is with emoji ?"
const rex = /[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}]/ug;
const updated = str.replace(rex, match => `[e-${match.codePointAt(0).toString(16)}]`);
console.log(updated);

См. Также ответ Виктора . ES2018 добавляет экранирование свойств Unicode. Но, к сожалению, поддержка по-прежнему нечеткая, хотя тот, который он использует в своем ответе, работает с Chromium и его производными (Chrome, Brave, Chromium Edge) и iOS Safari, хотя, к сожалению, пока нет в Firefox.

3 голосов
/ 26 января 2020

Если вы нацелены на ECMAScript 2018 и новее, вы можете использовать

/\p{Emoji}/ug

JS demo:

const str = "My string ? is with emoji ?";
console.log(
  str.replace(/\p{Emoji}/ug, (m, idx) =>
   `[e-${m.codePointAt(0).toString(16)}]`
  )
);
1 голос
/ 26 января 2020

Что вы можете сделать, это начать с Array.from():

Array.from("My string ? is with emoji ?")

Это даст вам отдельные символы в массиве:

["M", "y", " ", "s", "t", "r", "i", "n", "g", " ", "?", " ", "i", "s", " ", "w", "i", "t", "h", " ", "e", "m", "o", "j", "i", " ", "?"]

Здесь вы можете использовать charCode функция, чтобы проверить, является ли текущий элемент смайликом, и применить вашу пользовательскую функцию, используя .map().

Извлечь Как преобразовать один символ смайликов в число кодов Unicode в JavaScript? для начального преобразования и использования функции Array.map() для сопоставления и, наконец, преобразования массива в строку, используя .join("").

Примечание: Я объяснил процесс конвертации, чтобы ОП мог go опередить и попробовать его, и я намеренно не думал о том, чтобы кормить ОП ложкой полного решения, даже если у меня есть один, опробованный и протестированный.

...