android为什么在SIM卡中存中文联系人,重启之后,中文联系人名字会消失? 各位大大,android为什么在SIM卡中存中文联系人,重启之后,中文联系人名字会消失?但是存的号码还保留!有遇到类似现象的吗?谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没坏ContentValues cv = new ContentValues();cv.put("tag", "");cv.put("number", "");cv.put("newTag", "中文");cv.put("newNumber", "12345678"); getContentResolver().insert(SIM_CONTACTS_URI, cv); 重启之后,“中文”这2个字就没了,但是12345678这个号码还会保留! 这是android源码中的一个问题,很早之前就有了,我接触到是从1.6开始,现在还有?这个问题的原因是在往sim卡写联系人的时候会首先判断是不是标准的ascii码,不是的话会把这个名字用空格代替,代码如下:在AdnRecord.java中 if (!TextUtils.isEmpty(alphaTag)) { byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag); System.arraycopy(byteTag, 0, adnString, 0, byteTag.length); }至于sim卡中存储中文的80格式介绍请参考下面的链接http://blog.csdn.net/jennyvenus/archive/2008/04/20/2309701.aspx 那我先转成ucs2码,再存入sim卡吗? 现在发现使用byteTag = alphaTag.getBytes("utf-16be");变成的都是乱码! 试试,String str = new String(alphaTag.getBytes("utf-16be"), "utf-16be");byteTag = str.getBytes("utf-16be"); 上面的链接介绍得很清楚,在sim卡中存中文用80格式的话用80开头,然后加编码字符。ucs2和unicode只是字节序不同,unicode是小头在前,ucs2是大头在前。。你转成utf16之后需要把每个编码的前后字节交换位置。 原来如此,现在没有这个问题了,我的2.1的机器,联系人都是存在sim卡上的,换电池重启过多次也没问题。 String str = new String(alphaTag.getBytes("utf-16be"), "utf-16be"); byteTag = str.getBytes("utf-16le"); 这个不知道行不行,马上试试! 即使存储正确,打开文件读取时 编码不正确 也不行啊 会出现乱码或者是全ASCII码,比如纯英文现象...按其SIM卡规格存储后,打开时转成utf-8显示中文字符才可以正确 。 你对比的只是sim卡存储这部分代码吧 , 看看Android提供的相应位置的字符集字库,是不是一样的...不是所有的文字字符都是UNICODE字符集的,我记得2.X里简体中文是GBK... 我所想表达的意思是:不要只顾着SIM卡,不考虑自己在Android下... 找了很多资料:使用byteTag = alphaTag.getBytes("ISO-10646-UCS-2");ISO-10646-UCS-2这个就是UCS2编码格式,但是写入之后放在别的手机上读也是乱码!现在真不清楚了! 写进去你转一次,其编码顺序就已经乱了。当“联系人”程序再读出来的时候,就是乱码。我印象中是没有这个问题的,要不然你去看看我写着玩的一篇文章?http://blog.csdn.net/wenlin56/archive/2010/12/14/6074437.aspx 如果只是联系人读的时候变乱的话,那放在别的手机上应该没什么问题的!就像是:我在诺基亚手机上存了一个中文联系人,然后在android里面读取也是中文;现在在android上存了一条中文联系人,在别的手机上也是乱码! 存中文解决了但是发现一个问题 就是中英文数字混合这种形式存的话 英文 数字 也是按照utf-16格式存取 占2个字节 SIM卡最多只能存6个中文字符,现在如何才能存这种混合的情况呢? 这个好像是没有办法的,如果你要存中文的话在名字的开头会加上 0x80,读出来解析度话读到第一个字节是0x80的话走到就是80编码的解码过程,两个字节解出一个字符。android定义的adn文件中名字这个字段是13个,还是14个字节来着(不是很记得了),反正除开0x80只能放6个字符。号码段好像也有限制长度。具体多少也不记得了。如果要存超过6个字符的中文的话有两种办法好像。1,使用81或者82编码,具体你研究,但是这个很有限制条件,对中文不太适合。2,MS sim卡中MS有个存放额外名字的ef文件可以用来存放超出长度的字符,具体记不清了,可以研究下3gpp文档中的sim卡中的EF文件部分。号码超出长度部分也可以这样来存。但是很负责任的告诉你,android 在java层没有实现对这个ef文件的存储跟读取,自己研究研究应该可以实现。 jindan_jinming怎么解决的!我也遇到这样的问题! 楼上问的是字符序列,应该解决了吧,不知道,在android 1.0时,当时还无法发送中文短信,不过都在那个telephony/gsm里的源码里能找到 所有源码见博客:http://blog.csdn.net/jindan_jinming/article/details/6453116 手机支付功能编写的困惑,急求各位大神帮助!!!! 如何用自己的activity当浏览器,action如何写(在线等) android学习 jquerymobile对话框插件 将View装载在 scrollView里面如何实现绘图 layout editor设计器中怎么创建tabhost界面(非代码创建)? 安卓背景图设置 android中大家怎么存储相对较多的文字 获取scrollview包裹的textview 某一页面的内容 listview加载图片有时候不能正常显示 为什么在国内android market会搜索出很多韩国应用 android menu.lst在哪里设置呢?
ContentValues cv = new ContentValues();
cv.put("tag", "");
cv.put("number", "");
cv.put("newTag", "中文");
cv.put("newNumber", "12345678");
getContentResolver().insert(SIM_CONTACTS_URI, cv); 重启之后,“中文”这2个字就没了,但是12345678这个号码还会保留!
这个问题的原因是在往sim卡写联系人的时候会首先判断是不是标准的ascii码,不是的话会把这个名字用空格代替,代码如下:
在AdnRecord.java中
if (!TextUtils.isEmpty(alphaTag)) {
byteTag = GsmAlphabet.stringToGsm8BitPacked(alphaTag);
System.arraycopy(byteTag, 0, adnString, 0, byteTag.length);
}
至于sim卡中存储中文的80格式介绍请参考下面的链接
http://blog.csdn.net/jennyvenus/archive/2008/04/20/2309701.aspx
byteTag = str.getBytes("utf-16be");
用80开头,然后加编码字符。
ucs2和unicode只是字节序不同,unicode是小头在前,ucs2是大头在前。。
你转成utf16之后需要把每个编码的前后字节交换位置。
byteTag = str.getBytes("utf-16le");
这个不知道行不行,马上试试!
你对比的只是sim卡存储这部分代码吧 , 看看Android提供的相应位置的字符集字库,是不是一样的...不是所有的文字字符都是UNICODE字符集的,我记得2.X里简体中文是GBK...
使用byteTag = alphaTag.getBytes("ISO-10646-UCS-2");
ISO-10646-UCS-2这个就是UCS2编码格式,但是写入之后放在别的手机上读也是乱码!
现在真不清楚了!
我印象中是没有这个问题的,要不然你去看看我写着玩的一篇文章?
http://blog.csdn.net/wenlin56/archive/2010/12/14/6074437.aspx
就像是:
我在诺基亚手机上存了一个中文联系人,然后在android里面读取也是中文;现在在android上存了一条中文联系人,在别的手机上也是乱码!
但是发现一个问题 就是中英文数字混合这种形式存的话 英文 数字 也是按照utf-16格式存取 占2个字节
SIM卡最多只能存6个中文字符,现在如何才能存这种混合的情况呢?
这个好像是没有办法的,如果你要存中文的话在名字的开头会加上 0x80,读出来解析度话读到第一个字节是0x80的话走到就是80编码的解码过程,两个字节解出一个字符。
android定义的adn文件中名字这个字段是13个,还是14个字节来着(不是很记得了),反正除开0x80只能放6个字符。号码段好像也有限制长度。具体多少也不记得了。
如果要存超过6个字符的中文的话有两种办法好像。
1,使用81或者82编码,具体你研究,但是这个很有限制条件,对中文不太适合。
2,MS sim卡中MS有个存放额外名字的ef文件可以用来存放超出长度的字符,具体记不清了,可以研究下3gpp文档中的sim卡中的EF文件部分。号码超出长度部分也可以这样来存。
但是很负责任的告诉你,android 在java层没有实现对这个ef文件的存储跟读取,自己研究研究应该可以实现。
jindan_jinming怎么解决的!我也遇到这样的问题!
http://blog.csdn.net/jindan_jinming/article/details/6453116