2014-02-07 4 views
1

У меня возникли проблемы с преобразованием вложения для вложений (простой текстовый файл в кодировке Windows-1251 с латинскими и кириллическими символами) в String. I. У меня проблема с преобразованием кириллицы. я получил вложенный файл в кодировке Base64, как это: «?»Base64 String to Windows1251 (кириллические символы)

Base64Encoded email Attachment

Original file

Так что, когда я пытаюсь расшифровать его, я получил вместо кириллических символов.

Как я могу получить правильные символы на кириллице, а не "?"

Я уже пробовал этот код со всеми кодировками, но ничего не помогает получить правильные русские символы.

BASE64Decoder dec = new BASE64Decoder(); 

    for (String key : Charset.availableCharsets().keySet()) { 
     System.out.println("K=" + key + " Value:" + 
          Charset.availableCharsets().get(key)); 
     try { 
      System.out.println(new String(dec.decodeBuffer(encoded), key)); 
     } catch (Exception e) { 
      continue; 
     } 
    } 

Спасибо заранее.

+0

Вы уверены, что на самом деле это кириллическая строка, а не какие-то двоичные данные (сертификат PEM, его тип mime в разделе сведений - это приложение/октет-поток)? – Cromax

+0

Да, я получаю файл pem - это запрос к цифровому сертификату. Но его можно прочитать с помощью блокнота. Поэтому я хочу получить его содержимое в java. Может быть, вы знаете какую-либо библиотеку для таких задач? – user3283133

+0

Но я держал пари, что вы читали его в «Блокноте» в форме BASE64, не так ли? Используйте некоторый инструмент декодера BASE64 и посмотрите, что вы получаете. – Cromax

ответ

0

Я не очень хорошо знаком с BPEL и протоколами, которые он использует. Если вы связываетесь между узлами с использованием некоторых бинарных протоколов, вы должны: 1) обеспечить, чтобы клиент и получатель использовали одну и ту же кодировку и 2) преобразовали строку java в правильные байты в этой кодировке. Java хранит строку внутренне в формате UTF-16. Поэтому, когда вы выполняете String correct = new String(commonName.getBytes("ISO-8859-1"), "ISO-8859-5"), вы получите правильную строку в UTF-16. Затем вам нужно экспортировать его в байты в запрошенной кодировке, например. byte[] buff = correct.getBytes("UTF-8") Предполагая, что кодировка, которую вы используете между узлами, - UTF-8. Если произойдет, кодировка отличается, тогда вы должны убедиться, что она фактически поддерживает кириллические символы (например, ISO-8859-1 делает не).

Если вы используете XML для обмена данными, убедитесь, что он использует подходящую кодировку в <?xml encoding="UTF-8"?>. Вам не нужно тогда играть с байтами, вам просто нужно правильно «импортировать» строку (см. Переменную correct). Запись в XML преобразует символы автоматически, но она (кодирование) должна поддерживать символы, которые вы хотите записать. Поэтому, если вы установили encoding="ISO-88591", вы снова получите эти вопросительные знаки.

+0

Итак, я могу объяснить свое дело более подробно. Я получаю файл с кодировкой base64 (pem) для моего процесса bpel. Затем я декодировал эту строку Base64 для декодированной строки (байты). Затем я получаю экземпляр X509Certificate из этих байтов и пытаюсь извлечь Cn (Canonical Name) из этого файла. CN является кириллической фамилией владельца. Поэтому я думаю, что этот CN является строкой Windows-1251, из которой я хочу получить правильную строку Java String (UTF-16). Я пробовал: – user3283133

+0

новый String (((X500Name) certx509.getSubjectDN()). GetCommonName(). GetBytes («Cp1251»), «UTF-8»); Но это не помогает Если я пытаюсь получить String без какого-либо декодирования ((X500Name) certx509.getSubjectDN()). GetCommonName(); Результат такой: – user3283133

+0

Что вы сделали - это новая строка (cn.getBytes («Cp1251»), «UTF-8»), но она выглядит, как будто это не UTF-8 (как вывод показывает), но некоторые другие кодировки (предположительно, ISO-8859-5). На этом шаге мы хотим получить ** оригинальную ** последовательность байтов, которая была использована в CN во время генерации сертификата. Рассмотрим это: стандартная кодировка вашей системы - это, скажем, E5. С другой стороны, по умолчанию кодировка в файлах PEM - E1. Важно то, что оба кодирования представляют собой 8-битные кодировки (один байт на символ). Поэтому, если пользователь вводит (в E5) символ 0xD4 (д), он будет также отображаться как 0xD4 в строке CN, но поскольку он имеет кодировку E1, – Cromax