最近有朋友反映9530上发中文短信会出乱码。
前一篇Blog已经说明了CDMA上发SMS只能用Datagram来发送,中文乱码问题主要牵涉到一个函数:
SMSPacketHeader.setMessageCoding(Coding):设置发送数据的编码格式,如果不调用的话,由系统来自动选择最有效率的一种编码方式。比如,一般采用ASCII,如果里面包含复杂字符,则采用UCS2编码。
中文乱码问题在于字符串的获取或者发送不匹配或者不被网络所支持,最简单的做法是把数据都按照UCS2来获取和发送。也就是如下代码中加注释的两行。
public Datagram toDatagram(DatagramConnectionBase datagramConnectionBase) throws IOException
{
DatagramBase datagram = null;
byte[] data = _msg.getBytes("UTF-16BE");//第一步:获取UCS2编码的数据
datagram = (DatagramBase) datagramConnectionBase.newDatagram();
SmsAddress smsAddress = new SmsAddress("//" + _address);
SMSPacketHeader smsPacketHeader = smsAddress.getHeader();
smsPacketHeader.setMessageCoding(SMSPacketHeader.MESSAGE_CODING_UCS2);//第二部:设置发送数据的编码
datagram.setAddressBase(smsAddress);
datagram.write(data, 0, data.length);
return datagram;
}
附上,BlackBerry supports the following character encodings:
setMessageCoding支持的参数:
// Field descriptor #26 I
public static final int MESSAGE_CODING_DEFAULT = 0;
// Field descriptor #26 I
public static final int MESSAGE_CODING_8_BIT = 1;
// Field descriptor #26 I
public static final int MESSAGE_CODING_UCS2 = 2;
// Field descriptor #26 I
public static final int MESSAGE_CODING_KOREAN_KSX1001 = 6;
// Field descriptor #26 I
public static final int MESSAGE_CODING_ASCII = 4;
// Field descriptor #26 I
public static final int MESSAGE_CODING_ISO8859_1 = 5;
- "ISO-8859-1"
- "UTF-8"
- "UTF-16BE"
- "US-ASCII"