2013-07-21 154 views
3

我有一个字符串表示一个Unicode代码点,如"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

一个Unicode代码点是一个数字,所以你需要做的第一件事是分析你的字符串,看看它代表了什么样的价值。您可以使用binary_to_integer/2(可在R16,R15为你需要经过binary_to_list/1然后list_to_integer/2

一旦你的码点的数值,你可以简单地plonk的它在一个二进制文件(这是根本字符串的表示)告诉仙丹您传递数为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有什么关系?从v1.3.2开始,没有任何功能存在。他们被带走了吗? – user701847

相关问题