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

String 按字符拆分Erlang UTF8二进制文件,string,utf-8,binary,erlang,String,Utf 8,Binary,Erlang,如何拆分二进制Erlang字符串,将其数据作为UTF8字符处理 假设我们有一个二进制文件,它应该分为两部分,第一部分应该包含前两个UTF8字符。这里有几个例子: 应该变成[,] 应该变成[,]尽管如此,我还是不太清楚,但我认为这会让这个把戏成功: Eshell V6.2 (abort with ^G) 1> Input = <<"ąčęė">>. <<"ąčęė">>

如何拆分二进制Erlang字符串,将其数据作为UTF8字符处理

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


应该变成
[,]

尽管如此,我还是不太清楚,但我认为这会让这个把戏成功:

Eshell V6.2  (abort with ^G)          
1> Input = <<"ąčęė">>.                
<<"ąčęė">>                            
2> L = [X || <<X:2/binary>> <= Input].
[<<"ąč">>,<<"ęė">>]                   
3>

尽管如此,我还是不清楚,但我认为这会让我变得更聪明:

Eshell V6.2  (abort with ^G)          
1> Input = <<"ąčęė">>.                
<<"ąčęė">>                            
2> L = [X || <<X:2/binary>> <= Input].
[<<"ąč">>,<<"ęė">>]                   
3>

要将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].
split_2()->
%%1和2现在是前2个字符的unicode代码点。
[,休息]。
将二进制与utf8匹配将提取第一个utf-8编码字符,并将unicode码点作为整数返回,这就是为什么我们必须构建前两个字符的结果二进制。如果二进制文件中没有2个utf-8编码字符,此函数将失败


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

要将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].
split_2()->
%%1和2现在是前2个字符的unicode代码点。
[,休息]。
将二进制与utf8匹配将提取第一个utf-8编码字符,并将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>>).
trunc\u utf8(Utf8s,计数)->
trunc_utf8(Utf8s,Count,)。
trunc_utf8(,_Count,Acc)->Acc;
trunc_utf8(_Utf8s,0,Acc)->Acc;
trunc\u utf8(\u Utf8s,Count,Acc)->
trunc_utf8(T,计数-1,)。

碰巧需要这样的函数。以下是我的结论:

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>>).
trunc\u utf8(Utf8s,计数)->
trunc_utf8(Utf8s,Count,)。
trunc_utf8(,_Count,Acc)->Acc;
trunc_utf8(_Utf8s,0,Acc)->Acc;
trunc\u utf8(\u Utf8s,Count,Acc)->
trunc_utf8(T,计数-1,)。

很抱歉,我不明白您想要得到什么结果?我正在寻找一种基于字符数而不是字节数拆分二进制UTF8字符串的方法。很抱歉,我不明白您想要得到什么结果?我正在寻找一种基于字符数拆分二进制UTF8字符串的方法,不是字节。我的意思是数据应该由字符索引,而不是字节或位。恐怕您的代码片段对长度不均匀的字符串不起作用,而且结果应该是二进制文件,而不是位字符串。@cnduo您应该更清楚地表述这个问题。显示您希望看到的结果。可以将上述代码2替换为1并获取:[,,,,]请查看我的最新编辑。删除了可能存在的冗余和误导性信息。我的意思是,数据应该按字符而不是字节或位进行索引。恐怕您的代码片段对长度不均匀的字符串不起作用,而且结果应该是二进制文件,而不是位字符串。@cnduo您应该更清楚地表述这个问题。显示您希望看到的结果。可以将上述代码2替换为1并获取:[,,,,]请查看我的最新编辑。删除了可能存在的冗余和误导性信息。感谢您的回复。那么任意数量的字符如何分割呢?@cnduo恐怕你必须使用递归函数,一个接一个地提取字符,因为你看不到有多少字节对应你的字符数,换句话说,你必须解析所有的utf8字符,正如@kitty所说的。您只能显式地从二进制文件的前面提取字符,这里我取2,因此如果您想要一个任意数,那么您需要在二进制文件上递归。谢谢您的回复。那么任意数量的字符如何分割呢?@cnduo恐怕你必须使用递归函数,一个接一个地提取字符,因为你看不到有多少字节对应你的字符数,换句话说,你必须解析所有的utf8字符,正如@kitty所说的。您只能显式地从二进制前面提取字符,这里我取2,所以如果您想要一个任意数,那么您需要在二进制上递归。