2013-12-11 4 views
2

Мы разработали конкретный экспортер для них, что позволяет продукт на основе позиции обеспечить тип портфеля снимка - как для акций и основных портфелей доходов.Строка кодировки символов

Мы разработали конкретный экспортер для них, что позволяет продукт на основе позиции обеспечить тип портфеля снимка â € «как для акций и основных портфелей доходов.

Первый текст - это то, что я копирую из Джиры, второе - то, что печатается в Когнитиве. Я получаю текст от Jira в формате JSON через REST API и форматирую его с помощью построителя строк и, наконец, возвращаю нормальную строку в качестве вывода. Все символы, такие как " ' - и т. Д., Не печатаются правильно, и я получаю много из – в выходном тексте. Как я могу это исправить? Я думал, если бы я мог изменить кодировку выходной строки, возможно, это может сработать?

EDIT: Это то, что я использую, чтобы получить информацию из Jira, после чего извлечь то, что я хочу от JSON вернулся.

String usercreds = "?os_username=user&os_password=password"; 
    try { 
     url = new URL("http://jira/rest/api/2/issue/" + issuekey + usercreds); 

     URLConnection urlConnection = url.openConnection(); 

     if (url.getUserInfo() != null) { 
      String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes())); 
      urlConnection.setRequestProperty("Authorization", basicAuth); 
     } 

     InputStream inputStream = urlConnection.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     while ((s = reader.readLine()) != null) { 
      temp.append(s); 
      s = ""; 
     } 
     issue = new JSONObject(temp.toString()); 
     temp.setLength(0); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

Если я правильно понял, то должен быть способ для меня, чтобы указать, что я хочу выход быть ("application/json;charset=utf-8") где-то в этом коде, и что могло бы решить мою prolbem?

+0

Вы не можете изменить кодирование строки - но вы можете повлиять на преобразование между строкой и байтами. К сожалению, недостаточно ясно, где вы видите эти данные и что еще нужно знать, как вам помочь. Предоставьте больше информации о контексте и диагностике. –

+0

Исходные данные находятся в области проблемы Jira, я использую REST API для получения всей информации о проблемах, которая возвращается мне как объект JSON. Затем я извлекаю требуемый текст из этого объекта JSON и распечатываю его на странице Confluence, и там он не показывает указанные специальные символы. Если это не поможет, задайте мне более конкретный вопрос, чтобы я мог дать вам лучший ответ. – Schadenfreude

+1

Ну, первое, что нужно сделать, это выработать * где * он сломается.Запишите точные символы как кодовые единицы UTF-16 (и длину строки) на каждом этапе, и это поможет точно определить проблему. Какую кодировку использует Confluence, и можете ли вы повлиять на нее? –

ответ

2

Тире в ответном JSON U + 2013 (EN DASH.) При кодировании как UTF-8, если формирует последовательность байтов e2 80 93. Эти данные декодируются с использованием неправильной кодировки (скорее всего, Windows-1252). По умолчанию кодировка ввода-вывода по умолчанию Java зависит от системы.

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

Указанная линия находится в неисправности. Вы должны указать encoding при транскодировании с использованием InputStreamReader.

Например:

public static void readUtf8(URLConnection connection, Appendable out) 
     throws IOException { 
    CharBuffer buffer = CharBuffer.allocate(1024); 
    try (InputStream in = connection.getInputStream(); 
    Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { 
     while (reader.read(buffer) != -1) { 
     buffer.flip(); 
     out.append(buffer); 
     buffer.clear(); 
     } 
    } 
    } 

Примечания: технически, JSON может быть любая кодировка Unicode (не только UTF-8) - если вам нужно обращаться с этим чтением this.

Примечание 2: HttpUrlConnection, кажется, улучшились с Java 5, но я хотел бы убедиться, что это автоматическая длина обработки (чтение Content-Length заголовка/обработки фрагментированное кодирования/и т.д.).

+0

Изменено 'BufferedReader reader = new BufferedReader (новый InputStreamReader (inputStream)),' to 'BufferedReader reader = new BufferedReader (новый InputStreamReader (inputStream,« UTF-8 »)), и все было хорошо. – Schadenfreude

Смежные вопросы