我已经观察了这个问题多年了,不知道它来自哪里。我担心这个错误在2011年的Android新版本中仍然可以观察到,我希望你能最终帮助我完全理解它,如果不解决的话。
让我们考虑给定(真实)的情况。先生“A”正在使用索尼在其Xperia Arc(官方2.3.3)上的自定义短信/彩信应用程序。 B先生在他的里程碑(Cyanogen 6.12,非正式2.2)上使用了Android短信/彩信堆栈应用程序。他们两个都使用法语Android(如果重要的话)。
当A向包含特殊字符(如“ç”,“ê”)的B发送短信时,B收到一条消息,其中这些字符被空格替换。像“é”这样的人物工作正常。 当B将短信发送给A时,一切正常。 当A向自己发送短信时,一切正常。
结论:这不是移动提供商的错,因为它以一种方式而不是另一种方式工作。
所以,我首先猜到了A的自定义应用程序出了问题。用B的手机上的apk替换它。一切都保持不变。我反编译了应用程序,我没有找到sms字符串编码的位置。我总结说这个bug不是来自应用程序,而是来自Android编码字符串的方式......
我跑了另一个测试: 我写了一个只有标准字符的短信,类似于1.5个字符的250个字符。然后,我在短信中附加一个“ç”。 在A的电话上:柜台说消耗了10个字符。 在B的电话上:计数器说短信现在需要3个短信:字符串大小加倍!
结论: 在A的手机上,默认的字符集包括“ç”。 在B的手机上,当出现“ç”时,字符集会发生变化,每个角色需要两倍于原始空间。 (或者我错过了什么?)
问题: 为什么不同版本的Android没有使用相同的默认字符集? 在Android上,这些默认字符集是否取决于rom,例如? 我们可以在某处(在菜单中或直接在根电话上)配置/更改这些字符集吗? 还有另一种简单的方法来解决这个问题吗?
欢迎任何帮助,解释或经验:)
答案 0 :(得分:4)
您遇到编码问题。根据描述,它看起来像'A'在一个字符集中发送数据,而不包括有关什么字符集的信息。根本原因是要在两个系统之间传递扩展(非ascii)字符,他们必须就要使用的编码达成一致。如果限制为8位值,则系统同意使用相同的代码页。在SMS中有一个用于7或8位编码的特殊GSM代码页,或者可以使用UTF-16,它使用2个字节来表示每个字符。输入250个字符后跟单个扩展字符时看到的内容显示应用程序中发生的情况。 SMS消息限制为140个八位字节。当您使用8位编码时,250个字符适合2条消息(250 <280)但是一旦您添加“ç”,应用程序就会更改为使用UTF-16编码,所以突然所有字符都占用了2个八位字节,您可以只能在邮件中包含70个字符。现在需要3.5条短信来传输整条信息。
在Android上,SMS消息的解码是SmsCbMessage.java中框架电话代码的一部分。它解决了消息体的语言代码和编码问题。如果这是不正确的(消息是用英文代码页编码但使用法语扩展字符),那么你可以出现奇怪的字符。
你说这不是移动网络的错。我怀疑它是电话A的消息传递应用程序,尽管Android可能无法正确识别有效SMS的编码。我想知道A和iPhone或其他制造商设备之间的工作原理。
答案 1 :(得分:0)
当我必须在短信unicode应用中显示一些特殊字符时,我遇到了同样的问题。我使用的方法是将需要发送的字符串作为sms,在for循环中运行以获取每个字符,找到其ascii代码,使用该整数值使用分隔符对该字符串进行编码。此字符串可以作为sms发送,需要使用用于发送的相同分隔符进行解码,然后将其中的每个ascii代码字符转换为字符(特定于语言),通过附加转换后的字符形成字符串。此文本与作为短信发送的文本相同。
此致