检查elixir中字符串的有效性

Muk*_*rty 2 elixir

为什么以下不是有效的二进制字符串?

String.valid?(<<239, 191, 191>>)
false
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 6

239, 191, 191UTF-8中的字节解码为Unicode Codepoint U+FFFF:

iex(1)> <<x::utf8>> = <<239, 191, 191>>
<<239, 191, 191>>
iex(2)> x
65535
iex(3)> x == 0xFFFF
true
Run Code Online (Sandbox Code Playgroud)

这是一个Unicode非字符,并且String.valid?/1包含所有这些字符的列表,false在遇到任何这些字符时返回.


我在Elixir中找不到任何只检查UTF-8有效性并跳过非字符检查的函数,但是编写一个函数很简单:

defmodule A do
  def valid_utf8?(<<_::utf8, rest::binary>>), do: valid_utf8?(rest)
  def valid_utf8?(<<>>), do: true
  def valid_utf8?(_), do: false
end

for binary <- [<<0>>, <<239, 191, 191>>, <<128>>] do
  IO.inspect {binary, String.valid?(binary), A.valid_utf8?(binary)}
end
Run Code Online (Sandbox Code Playgroud)

输出:

{<<0>>, true, true}
{<<239, 191, 191>>, false, true}
{<<128>>, false, false}
Run Code Online (Sandbox Code Playgroud)