5

UTF-16LE でエンコードされた Elixir ビット文字列が与えられた場合:

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

これを読み取り可能な Elixir 文字列に変換するにはどうすればよいですか (「Devastator」と綴られています)。私が得た最も近い方法は、上記を Unicode コードポイント ( ) のリストに変換し、それらの先頭にエスケープ シーケンスを追加["0044", "0065", ...]しようとすることですが、これは無効なシーケンスであるため、Elixir はエラーをスローします。\u私はアイデアがありません。

4

2 に答える 2

8

最も簡単な方法は、:unicodeモジュールの関数を使用することです:

: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

(最後に null バイトがあるため、シェルでは文字列の代わりにバイナリ表示が使用され、OS によっては null バイトの余分な表現が出力される場合があります)

于 2016-09-29T15:01:31.127 に答える
1

具体的には、Elixir のパターン マッチングを利用できます<<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

出力:

Devastator
πr²
于 2016-09-29T14:50:22.777 に答える