如何在JavaScript中将一个表情符号转换为Unicode代码点数字?

24

如何在 JavaScript 中将此 转换为 1f600

''.charCodeAt(0);  

这将返回unicode 55357,但如何从中获取1f600?


这个npm包有一个将内容转换为Unicode的方法。https://www.npmjs.com/package/emoji-unicode - Mitul Gedeeya
@gurvinder372,我已经尝试了你的解决方案,但它并没有起作用。这不是重复的问题。 - Parth Gajjar
@MitulGedeeya 怎么在浏览器中实现? - Parth Gajjar
抱歉,这将是服务器端渲染。 :) 让我用函数给你答案。 - Mitul Gedeeya
@MitulGedeeya 使用了相同的代码并转换为浏览器端。谢谢 :) - Parth Gajjar
显示剩余2条评论
8个回答

41

双向

let hex = "".codePointAt(0).toString(16)
let emo = String.fromCodePoint("0x"+hex);

console.log(hex, emo);


4
非常感谢这里有反转功能! - rgbflawed
先生,我需要将提到的唯一代码转换为表情符号? - Kapil Soni
@Kapilsoni 请尝试使用 console.log( String.fromCodePoint("0xD83D","0xDE0A") ),我得到的是 - 但如果我改变这两个字符串的顺序,我会得到��,如果我将它们连接成"0xD83DDE0A",我会收到异常。 - Kamil Kiełczewski
@KamilKiełczewski:先生,我的情况是Unicode字符串为\uD83D\uDE0A。如果直接将\uD83D\uDE0A放入fromCodePoint中,则无法正常工作。我能以其他格式进行转换吗? - Kapil Soni

19

已添加脚本以在浏览器端进行转换

function emojiUnicode (emoji) {
    var comp;
    if (emoji.length === 1) {
        comp = emoji.charCodeAt(0);
    }
    comp = (
        (emoji.charCodeAt(0) - 0xD800) * 0x400
      + (emoji.charCodeAt(1) - 0xDC00) + 0x10000
    );
    if (comp < 0) {
        comp = emoji.charCodeAt(0);
    }
    return comp.toString("16");
};
emojiUnicode(""); # result "1f600"

多亏了https://www.npmjs.com/package/emoji-unicode


4
两个表情合成的、 charCodeAt 值在 0 到 4 之间的表情符号怎么处理?例如:‍♀️ - Bruno Lemos
(Javascript)如果您需要将其转换回表情符号,请使用以下代码:String.fromCodePoint(parseInt("1f600", 16)) - Martin Lloyd Jose
国旗无法正确渲染。 - Anil
简单的心形符号 '♥' 返回 NaN。 - Sodj
显示剩余3条评论

12

这是我使用的:

const toUni = function (str) {
  if (str.length < 4)
    return str.codePointAt(0).toString(16);
  return str.codePointAt(0).toString(16) + '-' + str.codePointAt(2).toString(16);
};

在我看来,这个Proso(解决方案提供商)的想法是正确的。根据Mozilla https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt,codePointAt专门用于处理表情符号或图标。 - lucsan
我的实验表明,您不需要使用toString(16)。如果表情符号长度为2个字符(s.length>1),则0位置的codePointAt(0)会呈现出HTML显示所需的十进制数。 - lucsan
我的错误,toString(16) 是获取十六进制值。 - lucsan

5

请阅读 此链接

以下是函数:

function toUTF16(codePoint) {
var TEN_BITS = parseInt('1111111111', 2);
function u(codeUnit) {
  return '\\u'+codeUnit.toString(16).toUpperCase();
}

if (codePoint <= 0xFFFF) {
  return u(codePoint);
}
codePoint -= 0x10000;

// Shift right to get to most significant 10 bits
var leadSurrogate = 0xD800 + (codePoint >> 10);

// Mask to get least significant 10 bits
var tailSurrogate = 0xDC00 + (codePoint & TEN_BITS);

 return u(leadSurrogate) + u(tailSurrogate);
}

如果您想在使用JSON的RESP API中使其正常工作,最佳解决方案是使用它。它会输出类似于"\uD83D\uDE00"(对于)的内容。 - ripreal

3

这里有另外一种方法。来源

 "".codePointAt(0).toString(16)

很棒的答案,再加上这个数据源:https://github.com/iamcal/emoji-data/blob/master/emoji.json,你就可以得到一个将表情符号转换为快捷方式的好方法。 - vvo

1

像 ‍⚕️ 这样的表情符号由两部分组成:+⚕️。
以下是获取它们的代码的方法:

emoji = "‍⚕️" // corresponds to  1f469-200d-2695-fe0f
code1 = emoji.codePointAt(0).toString(16) // gives only 1f469
code2 = [...emoji].map(e => e.codePointAt(0).toString(16)).join(`-`) // gives correctly 1f469-200d-2695-fe0f
console.log(code1)
console.log(code2)


emoji_code = "-".join(f"{ord(c):x}" for c in "‍⚕️") 在Python中的相应实现。 - Kolibril

0
const 
  getUnicodeHex = char => char.codePointAt(0).toString(16),    
  getEmoji = unicodeHex => String.fromCodePoint(unicodeHex)

console.log(
  getUnicodeHex(''),  // 1f600
  getEmoji(0x1f600)     // 
)

-1

在我看来,最好的答案是使用node-emoji包。

https://www.npmjs.com/package/node-emoji

以下是步骤。

  1. 执行 npm i node-emoji 命令

    var emoji = require('node-emoji');
    var convertEmoji = function(data){
    if(emoji.hasEmoji(data)){
        return emoji.unemojify(data);
      }
      else{
         return data;
      }
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接