按字符拆分Erlang UTF8二进制文件

时间:2015-04-06 13:47:27

标签: string utf-8 binary erlang

如何拆分二进制Erlang字符串将其数据视为UTF8字符?

假设我们有一个二进制文件,它应该分成两部分,第一部分应该包含前两个UTF8字符。这里有几个例子:
<<"ąčęė">>应该成为[<<"ąč">>, <<"ęė">>]

<<"あぁぅうぁ">>应该成为[<<"あぁ">>, <<"ぅうぁ">>]

3 个答案:

答案 0 :(得分:6)

要将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编码字符,并将unicode代码点作为整数返回,这就是为什么我们必须构建前两个字符的结果二进制文件。如果二进制文件中没有2个utf-8编码字符,则此函数将失败。

位串和二进制之间的区别在于二进制的大小必须是8位的倍数,而位串可以是任何大小。

答案 1 :(得分:0)

尽管如此,对我来说还不清楚,但我认为这样可以解决问题:

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.           

答案 2 :(得分:0)

碰巧需要这样的功能。这就是我最终的结果:

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>>).