2013-07-21 1 views
3

У меня есть строка, представляющая кодовую точку Юникода, например "272d". Как превратить это в "✭"?Как превратить код кода Unicode в строку Unicode?

Эликсир, конечно, понимает 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

я получаю это:

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

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

, так что я не уверен, если это работает. Я думаю, что вы хотите:

def from_code_point(<< code_point :: size(32) >>) do 
    "x{#{code_point}}" 
end 
2

Юникоде элемент кода является числом, поэтому первое, что вам нужно сделать, это разобрать вашу строку, чтобы увидеть, какое значение он представляет. Вы можете использовать binary_to_integer/2 (доступный в R16, для Р15 вам нужно пройти через binary_to_list/1, а затем list_to_integer/2.

После того как вы численное значение элемента кода, вы можете просто Плонк его в двоичном коде (который является основным представление строки), говоря эликсир, что число вы передаете является 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 
+0

Что такое R16/R15 по отношению к Elixir? Начиная с версии 1.3.2, ни одна из функций не существует. Они были вывезены? – user701847

Смежные вопросы