0

我花了很多时间试图让特殊字符在我们的应用程序中正确通过。我们的供应商告诉我们使用“GSM0338,也称为 ISO-8859”。对我来说,这意味着 ISO-8895-1,因为我们需要西班牙语字符。

流程:(告诉你一切,因为我已经玩了一段时间了。)

  1. 使用 notepad++ 以 UTF-8 编码创建消息文件。(没有保存为 ISO-8859-1 的选项)。

  2. 通过一个转换和写入新文件的快速 Java 程序发送每个文件:

    String text = readTheFile(....);
    
    output = text.getBytes("ISO-8859-1");
    FileOutputStream fos = new FileOutputStream(filesPathWithoutName + "\\converted\\" + filename);
    fos.write(output);
    fos.close();
    
  3. 另一个项目中的 SMPP 测试类读取这些文件:

    private static String readMessageFile(final String filenameOfFirstMessage) throws IOException {
    
        BufferedReader br = new BufferedReader(new FileReader(filenameOfFirstMessage));
        String message;
    
        try {
            StringBuilder sb = new StringBuilder();
            String line = br.readLine();
    
            while (line != null) {
                sb.append(line);
                sb.append("\n");
                line = br.readLine();
            }
            message = sb.toString();
        } finally {
            br.close();
        }
    
        return message;
    }
    
  4. 通话发送

    public void send(final String message, final String targetPhone) throws MessageException {
        SmppMessage smppMessage = toSmppMessage(message, targetPhone);
        smppSmsService.sendMessage(smppMessage);
    }
    
    private SmppMessage toSmppMessage(final String message, final String targetPhone) {
        SmppMessage smppMessage = new SmppMessage();
        smppMessage.setMessage(message);
        smppMessage.setRecipientAddress(toGsmAddress(targetPhone));
        smppMessage.setSenderAddress(getSenderGsmAddress());
        smppMessage.setMessageType(SmppMessage.MSG_TYPE_DATA);
        smppMessage.setMessageMode(SmppMessage.MSG_MODE_SAF);
        smppMessage.requestStatusReport(true);
        return smppMessage;
    }
    

问题: 发送包含字母ñ í ó 的短信,但这些字母显示为问号。

配置:

smpp.smsc.charset=ISO-8859-1
smpp.data.coding=0x03

非常感谢您对此的任何帮助。非常感谢您的阅读。

4

1 回答 1

5

好吧,您的提供商错了。GSM 03.38不是ISO-8859-1。通过“Z”(0x5A),它们是相同的,但之后它们会发散。例如,在 GSM 03.38 中,ñ 是 0x7D,而在 ISO-8859-1 中,它是 0xF1。由于 GSM 03.38 是一个 7 位代码,因此 0x7F 以上的任何内容都会以“?”的形式出现。0x5A 之后的任何内容都会出乎意料。

由于 Java 通常不支持 GSM 03.38,因此您将不得不手动解码。做起来应该不会太难,以下软件可能已经完成了您需要的大部分工作:

您可能还会发现这张GSM 03.38 和 Unicode 之间的转换表很有用。

于 2013-07-03T22:56:47.743 回答