android - Android 短信中的特殊字符

标签 android sms special-characters mms

多年来我一直在观察这个问题,但不知道它从何而来。我担心这个错误在 2011 年的新版本 Android 中仍然存在,我希望你最终能帮助我完全理解它,如果不能解决它的话。

让我们考虑给定的(真实的)情况。 “A”先生正在他的 Xperia Arc(官方 2.3.3)上使用 Sony 的自定义 SMS/MMS 应用程序。 B 先生在他的 Milestone(Cyanogen 6.12,非官方 2.2)上使用 android SMS/MMS 堆栈应用程序。他们都使用法语的 Android(如果重要的话)。

当 A 向 B 发送包含特殊字符(如“ç”、“ê”)的短信时,B 会收到一条将这些字符替换为空格的消息。不过,像“é”这样的字符工作正常。 当 B 向 A 发送短信时,一切正常。 当 A 向自己发送此短信时,一切正常。

结论:这不是移动提供商的错,因为它以一种方式工作,而不是以另一种方式工作。

所以,一开始我猜测是A的自定义应用出了问题。将其替换为 B 手机中的 apk。一切都保持不变。我反编译了应用程序,但没有找到短信字符串的编码在哪里完成。我断定错误不是来自应用程序,而是来自 Android 对字符串进行编码的方式...

我进行了另一个测试: 我写了一条只有标准字符的短信,比如 1.5 条短信中有 250 个字符。然后,我在短信中附加了一个“ç”。 在 A 的电话上:计数器说它消耗了 10 个字符。 在 B 的电话上:计数器显示短信现在需要 3 条短信:字符串大小加倍!

结论: 在 A 的电话上,默认字符集包括“ç”。 在 B 的手机上,当“ç”出现时,字符集发生变化,每个字符需要原来两倍的空间。 (或者我错过了什么?)

问题: 为什么不同版本的 Android 不使用相同的默认字符集? 例如,在 Android 上,这些默认字符集是否取决于 rom? 我们可以在某处(在菜单中或直接在有根电话上)配置/更改这些字符集吗? 是否有另一种简单的方法来解决此问题?

欢迎任何帮助、解释或经验:)

最佳答案

您遇到编码问题。从描述来看,“A”似乎在一个字符集中发送数据,但不包括有关该字符集的信息。根本原因是要在两个系统之间传递扩展(非 ascii)字符,它们必须就要使用的编码达成一致。如果您被限制为 8 位值,那么系统同意使用相同的代码页。在 SMS 中,有一个用于 7 位或 8 位编码的特殊 GSM 代码页,或者可以使用 UTF-16,它使用 2 个字节来表示每个字符。当您输入 250 个字符后跟一个扩展字符时,您看到的内容显示了应用程序中发生的情况。一条 SMS 消息被限制为 140 个八位字节。当您使用 8 位编码时,您的 250 个字符适合 2 条消息(250 < 280),但是一旦您添加了“ç”,应用程序就会更改为使用 UTF-16 编码,所以突然间您的所有字符都占用 2 个八位字节,您只能将 70 个字符放入一条消息中。现在需要 3.5 条 SMS 消息才能传输整条消息。

在 Android 上,SMS 消息的解码是 SmsCbMessage.java 中框架电话代码的一部分。它计算出消息体的语言代码和编码。如果这是不正确的(消息是用英语代码页编码但使用法语扩展字符),那么您可能会出现奇怪的字符。

您是对的,这不是移动网络的问题。我怀疑这是手机 A 的消息传递应用程序,尽管 Android 可能无法正确识别有效 SMS 的编码。我想知道它如何在 A 和 iPhone 或其他制造商的设备之间工作。

关于android - Android 短信中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6903852/

相关文章:

android - 如何构建一个提醒用户的 Android 应用程序,即使它被杀死了?

sms - Clickatell 替代短信网关?

C - Libcurl - 如何搜索带有特殊字符 (ä,ö,ü) 的邮件

Android:RSS 解析在特殊字符处停止

android - 在 android 中使用数据 api 进行 youtube 集成时出现 SAXNotRecognizedException?

android - 如何在安卓模拟器中安装adobe air

Android 和 HDMI CEC

java - 从惰性 ListView 适配器获取数据不起作用android

java - 无法在 BroadcastReceiver 中实例化接收器

css - 如何在 CSS 生成的内容中嵌入 Unicode Supplementary Private Use 字符?