3

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

4

2 回答 2

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
于 2013-07-31T00:59:20.057 回答
0

我明白了:

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

iex(2)> "x{272d}"
"x{272d}"

所以我不确定这是否有效。我想你想要这个:

def from_code_point(<< code_point :: size(32) >>) do
  "x{#{code_point}}"
end
于 2013-07-23T22:03:54.720 回答