将表情符号从十六进制代码转换为Unicode

4
我想在我的iOS和Android应用程序中使用表情符号。我检查了这里的表情符号列表,它列出了表情符号的十六进制代码。当我尝试直接使用十六进制代码(例如U+1F600)时,我在应用程序中看不到表情符号。我发现另一种表示表情符号的方法看起来像\uD83D\uDE00。使用此符号表示法时,可在应用程序中看到表情符号而无需任何额外代码。我认为这是表情符号的Unicode字符串。我认为这更多是一个通用问题,与表情符号的具体问题无关。我如何将表情符号的十六进制代码转换为如上所示的Unicode字符串?我没有找到任何列出表情符号Unicode的列表。

3
你是否在使用Swift?如果是的话,那么 "\u{1f600}" 可以正常工作。对于现代JavaScript也是如此。对于Java,appendCodePoint 应该可以工作。你能否提供更多信息,说明你要做什么?或者你是否在寻找将码点转换为UTF-16的通用算法? - Ray Toal
1
1F600 是完整的Unicode编码。D83D DE00 则是该Unicode编码的UTF-16编码方式。您可以使用RayToal评论中提到的完整Unicode编码,也可以使用任何Unicode到UTF-16编码的转换器,或者使用像https://punchdrunker.github.io/iOSEmoji/table_html/index.html这样列出UTF-16编码的表格来查找相应的编码。 - Andreas
3个回答

4

看起来你的问题实际上是“如何显示一个字符,知道它的编码点?”

这个问题实际上与语言有关!现代语言对此没有太大问题。在Swift中,我们可以这样做:

$ swift
Welcome to Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1). Type :help for assistance.
  1> "\u{1f600}"
$R0: String = ""

在JavaScript中,情况也是一样的:

$ node
> "\u{1f600}"
''

在Java中,你需要多做一些工作。如果你想直接使用代码点,可以这样说:

new StringBuilder().appendCodePoint(0x1f600).toString();

序列"\uD83D\uDE00"在这三种语言中都有效。这是因为这些“字符”实际上是Unicode所称的代理项,当它们以某种方式组合在一起时,它们表示一个单独的字符。如何工作的详细信息可以在网络上的许多地方找到(查找UTF-16编码)。该算法在那里。简而言之,您需要获取代码点,减去十六进制数10000,并像这样展开该差异的20位:110110xxxxxxxxxx110111xxxxxxxxxx
但与其担心这个翻译,如果您的语言支持良好,您应直接使用代码点。您还可以将表情符号字符复制粘贴到良好的文本编辑器中(确保编码设置为UTF-8)。如果您需要使用代理项,则最好查找显示称为“UTF-16编码”的Unicode图表。

非常好的解释。非常感谢。我能够像你在上下文中提到的那样,只使用Unicode \u{1f600}。我正在使用它在react-native中,然后将表情符号代码传递给Swift和Java,并且在两者上都可以工作。 - Varun Gupta

1
JavaScript - 双向

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

console.log(hex, emo);


1
在Delphi XE中,#$1F600等同于#55357#56832或D83D DE04笑脸。
在程序中,我以以下方式使用它:
const smilepage : array [1..3] of WideString =(#$1F600,#$1F60A,#$2764);

欢迎来到SO!感谢您的贡献,我已经为您调整了排版。 - B--rian

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