android-用Erlang解析ASCII字符
作者:互联网
与需要完成哪些解析以及在什么客户端/服务器上进行混淆.
When i send an Umlaut 'Ö' to my ejabberd,
it is received by ejabberd as <<"195, 150">>
之后,我将其作为推送通知发送给我的客户(通过GCM / APNS静默).从那里,客户端通过UTF-8解码对每个数字进行逐一构建(这是错误的).
i.e. 195 is first decoded to gibberish character � and so on.
如果要招待两个字节或3个或更多,则需要识别此重构.
这随字母语言的不同而不同(例如此处为德语).
客户将如何识别将要重构的语言(一次解码的字节数)?
要添加更多,
lists:flatten(mochijson2:encode({struct,[{registration_ids,[Reg_id]},{data ,[{message,Message},{type,Type},{enum,ENUM},{groupid,Groupid},{groupname,Groupname},{sender,Sender_list},{receiver,Content_list}]},{time_to_live,2419200}]})).
产生的json为:
"{\"registration_ids\":[\"APA91bGLjnkhqZlqFEp7mTo9p1vu9s92_A0UIzlUHnhl4xdFTaZ_0HpD5SISB4jNRPi2D7_c8D_mbhUT_k-T2Bo_i_G3Jt1kIqbgQKrFwB3gp1jeGatrOMsfG4gAJSEkClZFFIJEEyow\"],\"data\":{\"message\":[104,105],\"type\":[71,82,79,85,80],\"enum\":2001,\"groupid\":[71,73,68],\"groupname\":[71,114,111,117,112,78,97,109,101],\"sender\":[49,64,100,101,118,108,97,98,47,115,100,115],\"receiver\":[97,115,97,115]},\"time_to_live\":2419200}"
我给“ hi”作为消息,mochijson给了我ASCII值[104,105].
The groupname field was given the value "Groupname",
the ASCIIs are also correct after json creation i.e. 71,114,111,117,112,78,97,109,101
但是当我使用http://www.unit-conversion.info/texttools/ascii/
It is decodes as Ǎo��me and not "Groupname".
那么,谁应该解析?应该如何处理.
当重建ASCII时,我重建的消息全是乱码.
谢谢
解决方法:
这里要担心的事情有很多,并且与所需的编码或数据结构有关.在Erlang中,以下列方式之一处理文本:
>字节列表([0..255,…])
>这是您在侦听套接字时所得到的,并且数据作为列表返回.
> VM不假定编码.它们是字节,仅意味着更多.
>但是,VM可以将它们解释为字符串(例如io:format(“〜s〜n”,[List])).发生这种情况时(特别是带有〜s标志),VM会假定编码为latin-1(ISO-8859-1).
> Unicode代码点列表([0..1114111,…]).
>您可以从以unicode和列表形式读取的文件中获得这些文件.
>当您有诸如io:format(“〜ts〜n”,[List])这样的格式化程序时,可以在输出中使用它们,其中〜ts类似于〜s但作为unicode.
>这些列表表示您在unicode标准中看到的代码点,没有任何编码(它们不是UTF-x)
>这可以与latin-1字符列表结合使用,因为Unicode代码点和latin1字符在255以下具有相同的序列号.
>二进制文件(<<< 0..255,...>>)
>这就是您在以二进制格式收听或读取任何内容时所得到的.
>可以告诉VM承担许多事情:
>它们是没有特定含义(< Bin / binary>)的字节序列(0..255)
它们是utf-8编码的序列(< Bin / utf-8>))
它们是utf-16编码的序列(< Bin / utf-16>))
它们是utf-32编码的序列(< Bin / utf-32>)
> io:format(“〜s〜n”,[Bin])仍将假定任何序列为latin-1序列; io:format(“〜ts〜n”,[Bin])仅采用UTF-8.
> unicode列表和utf编码的二进制文件(称为iodata())的混合列表,专用于输出.
所以要点:
>字节列表
>拉丁1字符列表
> Unicode代码点列表
>字节的二进制
> UTF-8二进制
> UTF-16二进制
> UTF-32二进制
>其中许多列表,用于快速连接的输出
还要注意:在17.0版之前,所有Erlang源文件仅是latin-1. 17.0通过添加以下标头添加了一个选项,使编译器将您的源文件读取为unicode:
%% -*- coding: utf-8 -*-
下一个因素是,按照规范,JSON假定UTF-8作为其所有内容的编码.此外,Erlang中的JSON库将倾向于假定二进制是字符串,并且列表是JSON数组.
这意味着,如果您希望输出足够,则必须使用UTF-8编码的二进制文件来表示任何JSON.
如果您拥有的是:
>代表utf编码的字符串的字节列表,然后是list_to_binary(List)以获取正确的二进制表示形式
>代码点列表,然后使用unicode:characters_to_binary(List,unicode,utf8)获得utf-8编码的二进制文件
>代表拉丁文1字符串的二进制文件:unicode:characters_to_binary(Bin,latin1,utf8)
>任何其他UTF编码的二进制文件:unicode:characters_to_binary(Bin,utf16 | utf32,utf8)
获取该UTF-8二进制文件,并将其发送到JSON库.如果JSON库正确且客户端正确解析,则它应该是正确的.
标签:ejabberd,erlang,apple-push-notifications,xmpp,android 来源: https://codeday.me/bug/20191028/1950537.html