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

时间:2013-07-21 19:22:43

标签: unicode utf-8 elixir

我有一个表示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)}"

2 个答案:

答案 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