长短信发送Emoji 图标被截断的问题分析

来源:互联网 发布:php strip tags源码 编辑:程序博客网 时间:2024/05/29 05:13

问题:用安卓手机给iPhone发短信,短信内容是图标,超过一屏的时候,iPhone显示不出来。用三星手机之类的发,都有类似问题,严重的是整条短信都显示不了,好一点的是只有被截断的图标显示乱码。

截屏:
截图

大概了解一下,应该是字符集的问题,有字符被截断了。

短信使用7-bit,8-bit和UCS-2编码。从截图看,每个图标占用了4个字节,而不是2个字节。
这是怎么回事?

从Uncode的百度百科上找到答案
D800-DB7F:高位替代(High Surrogates)
DB80-DBFF:高位专用替代(High Private Use Surrogates)
DC00-DFFF:低位替代(Low Surrogates)
2个UCS-2编码(高位+低位),经过转换后变成一个UTF-16编码,从而扩展了表达范围。
这里的高位专用替代表示转换出来的UTF-16处于专用区内。所谓专用区,就是保留给大家放自定义字符的区域
UCS-2编码,如果高位是0xD800-0xDBFF,低位是0xDC00-0xDFFF,则表示是一个UTF-16编码。很明显,这种EMOJI图标用的就是扩展编码了。

代码修改
SmsMessage.java,fragmentText函数中增加以下代码

// check if UTF-16. Higher half range is 0xD800-0xDBFF, Lower half range is 0xDC00 - 0xDFFFif( textLen > nextPos ){    int lastChar = new Integer(text.charAt(nextPos-1));    int nextChar = new Integer(text.charAt(nextPos));    if( (lastChar >= 0xD800) && (lastChar <= 0xDBFF)        && (nextChar >= 0xDC00) && (nextChar <= 0xDFFF)){        nextPos -= 1;        Rlog.d(LOG_TAG, "UTF-16, nextPos - 1");    }}
0 0