关闭

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

标签: Emojiunicode
542人阅读 评论(0) 收藏 举报
分类:

问题:用安卓手机给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 - 0xDFFF
if( 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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10416次
    • 积分:310
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论