按字符拆分 Erlang UTF8 二进制文件
Split Erlang UTF8 binary by characters
如何拆分二进制 Erlang 字符串,将其数据视为 UTF8 字符?
假设我们有一个二进制文件,它应该被分成两部分,第一部分应该包含前两个 UTF8 字符。这里有几个例子:
<<"ąčęė">>
应该变成 [<<"ąč">>, <<"ęė">>]
<<"あぁぅうぁ">>
应该变成 [<<"あぁ">>, <<"ぅうぁ">>]
我仍然不清楚,但我认为这会成功:
Eshell V6.2 (abort with ^G)
1> Input = <<"ąčęė">>.
<<"ąčęė">>
2> L = [X || <<X:2/binary>> <= Input].
[<<"ąč">>,<<"ęė">>]
3>
更新:这个将把它分成S, TheRest
:
%% S is the number of characters you want
split_it(S, Bin) when S > 0 ->
case Bin of
<<P:S/binary, R/binary>> -> [P | split_it(infinity, R)];
<<>> -> [];
_ -> [Bin]
end.
要将 utf-8 编码的二进制字符串分成两部分,第一部分包含前两个字符,第二部分包含其余部分,您可以使用以下函数:
split_2(<<One/utf8,Two/utf8,Rest/binary>>) ->
%% One and Two are now the unicode codepoints of the first 2 characters.
[<<One/utf8,Two/utf8>>,Rest].
与具有 utf8 的二进制文件匹配将提取第一个 utf-8 编码字符和 return 作为整数的 unicode 代码点,这就是为什么我们必须构建前两个字符的结果二进制文件。如果二进制文件中前面没有 2 个 utf-8 编码字符,此函数将失败。
位串和二进制的区别在于二进制的大小必须是 8 位的倍数,而位串可以是任意大小。
正好需要这样的功能。这是我最终得到的:
trunc_utf8(Utf8s, Count) ->
trunc_utf8(Utf8s, Count, <<>>).
trunc_utf8(<<>>, _Count, Acc) -> Acc;
trunc_utf8(_Utf8s, 0, Acc) -> Acc;
trunc_utf8(<<H/utf8, T/binary>> = _Utf8s, Count, Acc) ->
trunc_utf8(T, Count - 1, <<Acc/binary, H/utf8>>).
如何拆分二进制 Erlang 字符串,将其数据视为 UTF8 字符?
假设我们有一个二进制文件,它应该被分成两部分,第一部分应该包含前两个 UTF8 字符。这里有几个例子:
<<"ąčęė">>
应该变成 [<<"ąč">>, <<"ęė">>]
<<"あぁぅうぁ">>
应该变成 [<<"あぁ">>, <<"ぅうぁ">>]
我仍然不清楚,但我认为这会成功:
Eshell V6.2 (abort with ^G)
1> Input = <<"ąčęė">>.
<<"ąčęė">>
2> L = [X || <<X:2/binary>> <= Input].
[<<"ąč">>,<<"ęė">>]
3>
更新:这个将把它分成S, TheRest
:
%% S is the number of characters you want
split_it(S, Bin) when S > 0 ->
case Bin of
<<P:S/binary, R/binary>> -> [P | split_it(infinity, R)];
<<>> -> [];
_ -> [Bin]
end.
要将 utf-8 编码的二进制字符串分成两部分,第一部分包含前两个字符,第二部分包含其余部分,您可以使用以下函数:
split_2(<<One/utf8,Two/utf8,Rest/binary>>) ->
%% One and Two are now the unicode codepoints of the first 2 characters.
[<<One/utf8,Two/utf8>>,Rest].
与具有 utf8 的二进制文件匹配将提取第一个 utf-8 编码字符和 return 作为整数的 unicode 代码点,这就是为什么我们必须构建前两个字符的结果二进制文件。如果二进制文件中前面没有 2 个 utf-8 编码字符,此函数将失败。
位串和二进制的区别在于二进制的大小必须是 8 位的倍数,而位串可以是任意大小。
正好需要这样的功能。这是我最终得到的:
trunc_utf8(Utf8s, Count) ->
trunc_utf8(Utf8s, Count, <<>>).
trunc_utf8(<<>>, _Count, Acc) -> Acc;
trunc_utf8(_Utf8s, 0, Acc) -> Acc;
trunc_utf8(<<H/utf8, T/binary>> = _Utf8s, Count, Acc) ->
trunc_utf8(T, Count - 1, <<Acc/binary, H/utf8>>).