使用ESC字符访问GSM 03.38扩展字符集

时间:2012-04-11 15:55:23

标签: c gsm

我编写的C应用程序通过串口与SIEMENS TC65 GSM调制解调器进行通信。我能够正确发送短信,但现在我想发送一些超出默认GSM 03.38字符集的字符。

请参阅:http://www.csoft.co.uk/sms/character_sets/gsm.htm

如果我尝试发送字符[,则此页面会告诉我必须使用ESC字符后跟<。问题是调制解调器正在解释ESC字符并中止发送消息,它不会读取完整的消息内容。

任何人都可以帮我发送这些字符放在“扩展”的GSM 03.38字符集上吗?

此致

2 个答案:

答案 0 :(得分:1)

转义字符不是指实际转义,而是指字符集主表上定义的转义字符。 @&gt; 0000000H&gt; 1001000ESC&gt; 0011011

要发送[,您需要发送数据0011011 0111100。这计为2个字符。

当然,您需要安排septets以填充八位字节作为消息中的任何其他字符。转义序列告诉兼容手机打印[而不是<。非常旧的电话或电话不理解辅助表中的字符将在主表中打印相同的值。

我不记得如果不理解它会发生什么,它可能会显示一个空格或根本不显示。

要发送消息“[已解决]”,您将组合字符ESC < S O L V E D ESC >。虽然只显示了8个字符,但仍会发送10个字符。然后,您将查找每个字符的septets,并组合0011011 0111100 1010011 1001111 1001100 1010110 1000101 1000100 0011011 0111110以形成八位字节,方法是将下一个septet的末尾移动到当前00011011 11011110 11110100 11001001 10110100 00010110 10001001 00011011 00011111的十六进制格式1BDEF4C9B416891B1F的开头,最后附加消息长度0A1BDEF4C9B416891B1F

Trivia:摩托罗拉手机工具(与RAZR V3,V9以及Z3,L7和L9等摩托罗拉手机一起提供的应用程序)错误地显示消息长度将[等字符计为一个字符编写消息时的GSM编码消息。

答案 1 :(得分:1)

链接表中有一些不正确的字符。我建议从3GPP here为GSM和最新的UICC here下载原始规范。 UICC规范包含欧元符号。

要访问Extension表,您需要添加转义控件0x1B,如下所示:

 ^ : 0x1B 0x14
 { : 0x1B 0x28
 } : 0x1B 0x29
 \ : 0x1B 0x2F
 [ : 0x1B 0x3C
 ~ : 0x1B 0x3D
 ] : 0x1B 0x3E
 | : 0x1B 0x40
 € : 0x1B 0x65
 page break : 0x1B 0x0A

使用示例:

// [Hello]
byte[] text = new byte[] {0x1B, 0x3C, 'H', 'e', 'l', 'l', 'o', 0x1B, 0x3E};

注意:

  1. 0-9,A-Z,a-z,空格(其他一些字符)的ASCII码与GSM默认字母相似。对于休息,请查看表格
  2. 如果手机/手机不支持分机表字符,则应根据默认表格字符显示它们(例如,欧元将显示为小'e')
  3. 如果您使用的是阿拉伯语或中文,则无法使用GSM默认字母及其扩展表。而是使用Unicode字符集2(UCS-2)