2016-09-29 3 views
2

にUTF-16LEエリクサーのビット列を変換する:私はこれが読めるエリクサー文字列に変換し得ることができる方法UTF-16LEでエンコードエリクサーのビット列を考えるとエリクサー文字列

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 

(それは「デバステーターを」アウト呪文) ?私が得た最も近いものは、上記のUnicodeコードポイント(["0044", "0065", ...])のリストに変換し、\uエスケープシーケンスの前に追加しようとしていますが、エリクサーは無効なシーケンスなのでエラーを投げます。私はアイデアがありません。

+0

ます」あなたはこの質問を既に回答しています(http://stackoverflow.com/a/39601246/3102718)。 –

+0

これは一時的なハックであり、より複雑な状況の場合などです。ヌルバイトで終わる未知の長さの文字列を解析すると、それは不十分でした。 – user701847

+0

ありがとう、ちょうど興味があった。 –

答えて

5

最も簡単な方法は、使用している機能:

:unicode.characters_to_binary(utf16binary, {:utf16, :little}) 

例えば、

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 
|> :unicode.characters_to_binary({:utf16, :little}) 
|> IO.puts 
#=> Devastator 

(代わりに文字列のバイナリ表示がシェルに使用され、OSに依存し、それがnullバイトのためにいくつかの余分な表現を印刷することができるので、非常に最後のNULLバイトは、あります)

+0

ああ、うわー...私は実際に見ていたこれらのメソッドのどれかが私を助けてくれるかどうかを知るために、特に 'バイナリ 'ですが、ページを下にスクロールして、Unicodeを見るのを怠ってしまった...ありがとう! – user701847

+1

これはいいですね!私は ':unicode.characters_ *'関数もバイナリを受け入れていませんでした。 @ user701847あなたはおそらく私の代わりにこの答えを受け入れるべきです。 – Dogbert

1

あなたは、具体的<<codepoint::utf16-little>>、エリクサーのパターンマッチングを利用することができます:

defmodule Convert do 
    def utf16le_to_utf8(binary), do: utf16le_to_utf8(binary, "") 

    defp utf16le_to_utf8(<<codepoint::utf16-little, rest::binary>>, acc) do 
    utf16le_to_utf8(rest, <<acc::binary, codepoint::utf8>>) 
    end 
    defp utf16le_to_utf8("", acc), do: acc 
end 

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 
|> Convert.utf16le_to_utf8 
|> IO.puts 

<<192, 3, 114, 0, 178, 0>> 
|> Convert.utf16le_to_utf8 
|> IO.puts 

出力::unicodeモジュールから

Devastator 
πr² 
+1

ああ、それは私が行方不明だった、ありがとう!私は 'codepoint'を使ったことがなく、' codepoint :: utf8'のようにマッチしました。私は基本的に2バイトで何をするのか分からなかった。 'codepoint :: utf16-little <- binary >>のために:" "、do:<< codepoint :: utf8 >> – user701847

関連する問題