如何将Unicode代码点转换为Unicode字符串?

如何将Unicode代码点转换为Unicode字符串?,unicode,utf-8,elixir,Unicode,Utf 8,Elixir,我有一个表示Unicode代码点的字符串,如“272d”。如何将其转换为✭" Elixir当然理解Unicode: iex> << 10029 :: utf8 >> "✭" iex> "x{272d}" "✭" iex>> "✭" iex>“x{272d}” "✭" 但我需要一个函数,它接受四个字符并返回Unicode字符串: def from_code_point(<< code_point :: size(32) >>) do

我有一个表示Unicode代码点的字符串,如
“272d”
。如何将其转换为
✭"

Elixir当然理解Unicode:

iex> << 10029 :: utf8 >>
"✭"

iex> "x{272d}"
"✭"
iex>>
"✭"
iex>“x{272d}”
"✭"
但我需要一个函数,它接受四个字符并返回Unicode字符串:

def from_code_point(<< code_point :: size(32) >>) do
  ???
end
def from_code_point(>)do
???
结束
或者可能

def from_code_point(<< a, b, c, d >>) do
  ???
end
def from_code_point(>)do
???
结束
我还尝试将其作为宏:

defmacro from_code_point(<< code_point :: size(32) >>) do
  quote do
    "x{unquote(code_point)}"
  end
end
defmacro from_code_point(>)do
引述
“x{unquote(代码点)}”
结束
结束
但这只是返回
“x{unquote(code\u point)}”

我得到了以下结果:

iex(1)> << 10029 :: utf8 >>
"✭"

iex(2)> "x{272d}"
"x{272d}"
iex(1)>>
"✭"
iex(2)>“x{272d}”
“x{272d}”
所以我不确定这是否有效。我想你想要这个:

def from_code_point(<< code_point :: size(32) >>) do
  "x{#{code_point}}"
end
def from_code_point(>)do
“x{{code_point}”
结束

Unicode码点是一个数字,因此您需要做的第一件事是解析字符串以查看它代表的值。您可以使用
二进制到整数/2
(在R16中提供,对于R15,您需要通过
二进制到整数/1
然后
列表到整数/2

一旦你得到了代码点的数值,你就可以简单地将它转换成二进制(这是一个字符串的基本表示形式),告诉elixir你传递的数字是一个Unicode代码点,就像这样

def to_string(input) do
  <<binary_to_integer(input, 16) :: utf8>>
end

R16/R15与长生不老药的关系到底是什么?从v1.3.2开始,所有功能都不存在。它们是否已被删除?
def to_string2(input) do
  codepoint = String.slice(input, 0, 4)
  <<binary_to_integer(codepoint, 16) :: utf8>>
end