如何将Unicode代码点转换为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
“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