2024-2-21
虽然微信和WhatsApp的普遍使用,人们现在很少要用短信来发消息了,但是短信仍然在许多领域发挥着重要的作用,比如医疗机构里面的预约通知,定时检查的提醒等等。
最近发现给诊所设计的短信提醒系统记录的发出短信的数量与电信公司收取费用的短信数量不一致,短信服务器记录的发出的短信数量少于电信公司收取费用的短信数量,显然是那个方面出了问题。电信公司的系统我们无从查看,唯有从自己的短信系统检查,确定没有问题时才能跟电信公司要求检查。
检查自己的短信系统,看不出任何问题。后来在手工重发那些未发送成功的短信时,发现其中有一间诊所的短信,一条短信被分成了三次发送,毫无疑问,这就是造成短信服务器记录与电信公司收取费用记录的数量不一致的原因。认真检查这间诊所所发的短信,其内容(图1)与其他诊所所发的短信内容(图2)并无多大差别,均在一条(英文)短信允许的160个字符内。为了找出原因,我利用短信服务器使用的华为调制解调器提供的用户接口界面,将短信内容从后面往前一个一个字符的删掉,当删除到appointment里的前面的“t”时(图3,图4),短信由三条变成了两条,“t”可能有问题。继续往前删除至“It’s”的“’”此时内容只剩下了两个字符(图7),短信内容才变成一条短信,显然这个“’”是有问题的,“t”和“’”可能是造成短信内容分裂的原因。
恢复原来的短信内容,只删除掉“t”,短信仍然被分成三段,先恢复“t”再删掉“’”,全部短信内容恢复成正常的一条短信。从键盘输入“’”来恢复成原来的短信内容,并没有出现原先被分裂成三段的情况。可以断定,原来的“’”和现在键盘输入的“’”是不一样的,只是在英文字符里差别不大,不易觉察。认真比较原来的“’”,它比键盘输入的要肥一些,这个肥“’”是在中文输入状态下形成的。英文的“’”是ASCII code,内部的代码是0x27,占一个字节,而中文“’” GB2312汉字编码内部的代码是0xA3A7,占两个字节。
根据短信发送规则,一条英文短信可以发送160个字符(图7),而一条中文短信只能发送70个字符(中文)(图6),ASCII code最高位为0,二进制表示为0B0XXXXXXX,而GB2312汉字编码内部的代码第一个字节最高位为1,二进制表示为0B1010XXXX。短信系统检测到内容包含中文编码,如是按中文短信发送,这就是为什么一条短信分三次发送的原因。