我有一个表示Unicode代码点的字符串,例如"272d"
。如何将其转换为"✭"
?
Elixir当然理解Unicode:
iex> << 10029 :: utf8 >>
"✭"
iex> "x{272d}"
"✭"
但我需要一个函数,它接受四个字符并返回Unicode字符串:
def from_code_point(<< code_point :: size(32) >>) do
???
end
或可能
def from_code_point(<< a, b, c, d >>) do
???
end
我也尝试过这个宏:
defmacro from_code_point(<< code_point :: size(32) >>) do
quote do
"x{unquote(code_point)}"
end
end
但这只会返回"x{unquote(code_point)}"
。
答案 0 :(得分:2)
Unicode代码点是一个数字,因此您需要做的第一件事就是解析字符串以查看它代表的值。您可以使用binary_to_integer/2
(在R16中提供,对于R15,您需要通过binary_to_list/1
然后list_to_integer/2
。
一旦获得了代码点的数值,就可以通过告诉elixir你传递的数字是Unicode代码点,就可以简单地将它放在二进制文件(这是字符串的底层表示)中,就像这样
def to_string(input) do
<<binary_to_integer(input, 16) :: utf8>>
end
如果你必须从一个更大的字符串中提取它,你可以将String.slice/3
置于其中,如此
def to_string2(input) do
codepoint = String.slice(input, 0, 4)
<<binary_to_integer(codepoint, 16) :: utf8>>
end
答案 1 :(得分:0)
我明白了:
iex(1)> << 10029 :: utf8 >>
"✭"
iex(2)> "x{272d}"
"x{272d}"
所以我不确定这是否有效。我想你想要这个:
def from_code_point(<< code_point :: size(32) >>) do
"x{#{code_point}}"
end