短信非ASCII字符编码

gur*_*lex 7 sms character-encoding

我有一部诺基亚N900手机,当发送短信时,小部件会显示消息中剩余的字符数(以及发送整条消息所需的实际短消息数).

我住在法国,在用非ASCII字符编写邮件时,我注意到以下奇怪的事情:

  • 一些非ASCII字符编码在一个字符/字节上,例如"é","è","à","ù"
  • 某些非ASCII字符(如"ç","ê","ô")的存在会消耗固定数量的90个字符/字节+每个字符1个字节
  • 第二个"ç","ê"等的存在仅消耗1个额外字节.

所以我想知道消息是如何编码的,因为我看不到上面的方案与我所知的传统编码(iso-8859-1,UTF-8,UTF-16 ......)相匹配.

tim*_*eam 9

https://en.wikipedia.org/wiki/SMS#Message_size

根据编码,SMS可以发送160/140/70个字符.如果使用任何非ASCII字符,则整个消息必须以UTF-16编码,因此您经历了"消费".


hot*_*309 6

@Vicky和@timdream是正确的,除了我认为它在技术上是UCS-2而不是手机有时使用的UTF-16,每个字符有一个固定的16位大小.UTF-16使用每个字符两个或四个字节的可变宽度,具体取决于要编码的字符. 这篇维基百科文章详细解释了这一点.UCS-2严格将消息最多删除70个字符(160字节).尽管Unicode Consortium对UCS-2的描述有点令人困惑,但网络上处理SMS的少数网站确认维基百科是正确的.

  • 我的理解是UTF-16使用每个字符2或4个字节的可变宽度(1或2个16位代码). (2认同)

Vic*_*cky 5

你已经得到了@timdream的答案,但只是另外一点,你提到的一些扩展字符作为单个字符包含在GSM 7位字母表中,有些是通过额外的转义字符在GSM 7位中编码的(所以用于表示该字符的两个字节)有些不能在GSM 7位中进行编码,而是需要编码为UTF-16.

完整的字母表定义如下:http: //www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT

注意c-cedilla的特殊特性 - 来自该文件,

ETSI GSM 03.38规范在0x09处显示大写的C-cedilla字形.这可能是因为处理带有下行字符的字符的显示能力有限.但是,语言覆盖意图显然是针对小写的c-cedilla,如下面的映射所示.大写C-cedilla的映射显示在映射表的注释行中.

有些设备将大写和小写c-cedilla编码为相同的编码字符(0x09).