将 UTF-16LE Elixir 位串转换为 Elixir 字符串
Converting a UTF-16LE Elixir bitstring into an Elixir String
给定一个以 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", ...]
) 并尝试将 \u
转义序列添加到它们之前,但是 Elixir 抛出一个错误,因为它是一个无效序列。我没主意了。
您可以使用 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²
最简单的方法是使用 :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
(最后有一个空字节,所以在 shell 中将使用二进制显示而不是字符串,并且根据 OS 它可能会为空打印一些额外的表示字节)
给定一个以 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", ...]
) 并尝试将 \u
转义序列添加到它们之前,但是 Elixir 抛出一个错误,因为它是一个无效序列。我没主意了。
您可以使用 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²
最简单的方法是使用 :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
(最后有一个空字节,所以在 shell 中将使用二进制显示而不是字符串,并且根据 OS 它可能会为空打印一些额外的表示字节)