今天遇到一个问题——一个短信里面最多可以容纳多少个中英文混编的字符?顺手google了以下,发现这个事情跟我的直觉还是不太一样的,特此记录,以备后查。

直觉是:

  1. 一条短信最多70个中文字符
  2. 一条短信最多140个英文字符或数字 (一个中文字符 = 2个英文字符或数字)
  3. 混合中文和英文的话,就按中文2字节,英文或数字1字节算,比如一半一半的情况总共有35个中文,70个英文...

然而,直觉是错误的!

真实情况:

  1. 一条短信最多70个中文字符 (这个没错)
  2. 一条短信最多160个英文字符或数字 (稍后解释)
  3. 混合中英文的话,最多70个字符,一个中文、英文或数字都算一个字符! (稍后解释)

为什么呢?

当初发明短信的时候,都是使用英文的,然后,估计是拍脑袋,定下了一条短信160个字符的限制 —— 160 = 80 * 2, 貌似刚好是传统打字机两行文本的长度,难道不只是巧合?

然而,这160个字符在网络上传输的时候,并不是按一个字节8个bit存放一个字符进行传输的——估计是为了节省空间吧,使用了7个bit存放一个字符的方式进行传输,即只能发ASCII字符。算一下,160 7bit = 1120bit = 140 8bit, 刚好PDU是140字节。后来这个140字节的限制就写入了短信标准中去了 -- GSM 03.38

到了手机短信国际化的年代,比如使用中文的时候怎么办? 后来就通常使用16bit来表示一个中文字符,注意哦,这个用的是UCS-2编码,是固定长度的编码方式——即使是英文或数字,也得占用16bit. 算一下,140 8bit = 1120bit = 70 16bit, 刚好只能容纳70个字符...详见:GSM 03.38

这些标准看起来都是2G时代的标准,不知道以后3G、LTE等的标准是否对此进行了扩展...

参考

  1. 手机短信的编码和长度限制-天缘博客
  2. UTF-16/UCS-2
  3. GSM 03.38