310.2. 数据编码、字母和国际字符集
数据编码和字母顺序可以基于每消息进行指定。 可以为端点指定默认值。 理解这些选项之间的关系和设置了多个值时组件的行为方式非常重要。
数据编码是 SMPP wire 格式的 8 位字段。
alphabet 对应于数据编码字段的 0-3 位。 对于某些类型的消息,使用消息类(通过设置数据编码字段的位 5),数据编码字段的较低两个位不解释为 alphabet,只有第 2 位和第 3 位影响 alphabet。
另外,当前 JSMPP 库的版本只能显示支持位 2 和 3,假定位 0 和 1 用于消息类。 这就是为什么 JSMPP 中的 Alphabet 类不支持值 3 (二进制 0011),它代表 ISO-8859-1。
虽然 JSMPP 提供了消息类参数表示,但 Camel 组件目前并不提供在 data coding 字段中手动设置对应位的方法。
在传出消息中设置 data coding 字段时,Camel 组件将考虑以下值并使用它的第一个值:
- 在标头中指定的数据编码
- 在标头中指定的 alphabet
- 端点配置中指定的数据编码(URI 参数)
旧版本 Camel 对国际字符集的支持有错误。 此功能仅在单个编码用于所有消息时发挥作用,并且在用户想要逐个消息进行改变时非常有用。 需要此工作的用户应该确保其版本的 Camel 包括针对
JIRA issues Macro:com.atlassian.sal.api.net.ResponseStatusException: Unexpected 响应。状态代码: 404
.
除了试图向 SMSC 发送数据编码值外,Camel 组件还会尝试分析消息正文,将其转换为 Java String (Unicode),并把它转换为对应的 alphabet 在决定在字节数组中使用的字节阵列时,Camel SMPP 组件不会考虑使用数据编码值(header 或配置),它只考虑在指定的顺序中的字节阵列。
如果 String 中的一些字符不能以所选字母代表,则它们可能会被问号(?)符号替代。 API 用户可能需要考虑检查其消息正文是否可以转换为 ISO-8859-1,然后再将其传递至组件,如果不是,请设置 alphabet 标头来请求 UCS-2 编码。 如果根本没有指定 alphabet 和数据编码选项,则组件可能会尝试检测所需的编码,并为您设置数据编码。
alphabet 代码列表在 SMPP 规范 v3.4 节 5.2.19 节中指定。 SMPP 规范的一个显著限制是,明确请求使用 GSM 3.38 (7 位)字符集没有字母代码。 为 alphabet 选择 0 值选择 SMSC 默认 alphabet,这通常意味着 GSM 3.38,但不保证。 SMPP 网关 Nexmo 实际上允许使用控制面板选项 将默认映射到任何其他字符集。建议用户与 SMSC 运算符进行检查,以确认使用哪个字符集作为默认值。