2017-02-28 8 views

答えて

5

バイト239, 191, 191は、Unicodeコードポイント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を返します。


私はUTF-8の有効性のための唯一のチェックとは、文字以外のチェックをスキップすることエリクサーで任意の関数を見つけることができなかったが、それは書くために些細です

1:

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} 
関連する問題