2013-07-21 152 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

相關問題