2013-07-03 2 views
0

Я потратил сумасшедшее время, пытаясь получить специальные символы, чтобы пройти надлежащим образом в нашем приложении. Наш поставщик сказал нам использовать «GSM0338, также известный как ISO-8859». Для меня это означает ISO-8895-1, поскольку нам нужны испанские символы.Специальные символы, проходящие как? в SMPP и Java

Поток: (Рассказывая вам все, так как я играл с этим на некоторое время.)

  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. Calls отправить

    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 

Абсолютно любая помощь с этим было бы весьма признателен. Большое вам спасибо за чтение.

ответ

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, вам придется декодировать вручную. Оно не должно быть слишком трудно сделать, и следующий кусок программного обеспечения, возможно, уже делают большую часть того, что вам нужно:

Вы также можете найти this translation table между GSM 03.38 и Unicode полезной.