Java делает String для кодирования String - PullRequest
0 голосов
/ 27 мая 2018

GET http с сервера: // HTTP GET запрос приватного статического списка sendGet () выдает исключение {

    String url = "http://********/ReciveMessage";

    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

    // optional default is GET
    con.setRequestMethod("GET");

    //add request header

    con.setRequestProperty("Accept-Charset", "UTF-8");

    int responseCode = con.getResponseCode();

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
        System.out.println(inputLine);
    }
    in.close();


    String str = response.toString(); //str is the problem


}

Я получаю строку символов с сервера, которая выглядит следующим образом:

str = "\\u05d0";

Я заметил, что не могу декодировать строку.

Так что я хотел бы знать, как это сделать, к этому

str = "\u05d0";

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я использую решение Bobulous и модифицирую его, и теперь оно работает с ASCII и UTF-8 в одной строке:

private String Decode(String raw) {
    final Pattern UNICODE_CHARACTER_PATTERN = Pattern.compile("\\\\u([0-9A-Fa-f]{2,4})");

    StringBuilder sb = new StringBuilder(raw.length() / 7);

    Matcher matcher = UNICODE_CHARACTER_PATTERN.matcher(raw);

    while (raw.length() != 0) {
        if (raw.charAt(0) == '\\') {
            matcher = UNICODE_CHARACTER_PATTERN.matcher(raw);
            String hexCode = "";
            char[] decodedChars = null;
            boolean find = false;
            if (matcher.find()) {
                find = true;
                hexCode = matcher.group(1);
                decodedChars = Character.toChars(Integer.valueOf(hexCode, 16));
                sb.append(decodedChars);
            }
            if(find)
                raw = raw.substring(matcher.group(0).length());
            else {
                if(raw.length() > 2) {
                    char c = (raw.charAt(1));
                    raw = raw.substring(2);
                    switch(c) {
                        case 'n':
                            sb.append("\n");
                            break;
                        case 't':
                            sb.append("\t");
                            break;
                        case 'b':
                            sb.append("\b");
                            break;
                        case 'r':
                            sb.append("\r");
                            break;
                        case 'f':
                            sb.append("\f");
                            break;
                        case '\'':
                            sb.append("\\");
                            break;
                        case '\"':
                            sb.append("\"");
                            break;
                        default:
                            sb.append("\\"+c);
                            break;
                    }
                }else {
                    raw = raw.substring(1);
                    sb.append("\\");
                }
            }
        } else {
            sb.append(raw.charAt(0));
            raw = raw.substring(1);
        }
    }       

    return sb.toString();
}

ОБНОВЛЕНИЕ: добавить регистр \ n, \ t и т. Д.

0 голосов
/ 27 мая 2018

Если ваш сервер не возвращает ничего, кроме потока кодовых точек Unicode, закодированных в описываемой вами форме (без необработанных символов, например, только кодовые точки в форме \u1234), тогда следующий код преобразует такую ​​последовательность в декодированные символы:

public class UnicodeDecoder {

    private static final Pattern UNICODE_CHARACTER_PATTERN =
            Pattern.compile("\\\\u([0-9A-Fa-f]{2,4})");

    public static void main(String[] args) {
        String raw = "\\u05d0\\u05d1\\u05d2\\u05d3";

        StringBuilder sb = new StringBuilder(raw.length() / 7);

        Matcher matcher = UNICODE_CHARACTER_PATTERN.matcher(raw);
        while (matcher.find()) {
            String hexCode = matcher.group(1);
            char[] decodedChars = Character.toChars(
                    Integer.valueOf(hexCode, 16));
            sb.append(decodedChars);
        }

        System.out.println("Raw:\n"+raw);
        System.out.println("Decoded:\n"+sb.toString());
    }   
}

Этот пример кода дает вывод:

Raw:
\u05d0\u05d1\u05d2\u05d3
Decoded:
אבגד

Обратите внимание, что этот метод не очень эффективен.Если производительность важна, вы можете переделать это так, чтобы вручную взять подстроку каждой последовательности \u1234, а затем добавить декодированные символы в подстроку.Это позволило бы избежать затрат на сопоставление регулярных выражений.

И если ваш сервер возвращает символы, отличные от кодовых точек Unicode, вам придется перемещаться по ответам сервера за символом, проверяя наличие \u1234последовательность.Все, что не является последовательностью кодов Unicode, должно быть добавлено непосредственно к вашему StringBuilder;все, что является кодовой точкой Unicode, должно быть сначала декодировано в символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...