为什么以下不是有效的二进制字符串?
String.valid?(<<239, 191, 191>>)
false
答案 0 :(得分:5)
UTF-8中的字节239, 191, 191
解码为Unicode Codepoint U+FFFF
:
iex(1)> <<x::utf8>> = <<239, 191, 191>>
<<239, 191, 191>>
iex(2)> x
65535
iex(3)> x == 0xFFFF
true
这是一个Unicode Non-Character和String.valid?/1
has a list of all such characters,当遇到其中任何一个时会返回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
输出:
{<<0>>, true, true}
{<<239, 191, 191>>, false, true}
{<<128>>, false, false}