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