iOS / Java (GWT + GAE) / UrbanAirship с кодировкой немецких умляутов - PullRequest
0 голосов
/ 08 декабря 2011

- нашел решение моей проблемы, код обновлен -

У меня проблема с отправкой умлаутов (öäü) через iPhone через push-сообщения на iPhone. Я использую Java / GWT в Google AppEngine и использую UrbanAirship для push-уведомлений. Следующий код прекрасно работает на моем Mac, push-уведомление приходит с правильным немецким умлаутом. Если я разверну его на gae-сервере, немецкие умлауты не будут работать. До сих пор я узнал, что в GAE стандартная кодировка - US-ASCII и с некоторой помощью здесь изменил getBytes () и все остальное на UTF-8. Проблема все еще есть, но теперь вопросительные знаки, которые заменили умлауты на iPhone, которые теперь стали «бриллиантом» в качестве фона?!

Вот метод, который я использую (работает локально, не в GAE):

private Boolean sendNotification(String appKey, String appMasterSecret, String jsonBodyString) {

    try {

        URL url = new URL("https://go.urbanairship.com/api/push/broadcast/");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setConnectTimeout(12000);

        String authString = appKey + ":" + appMasterSecret;
        String authStringBase64 = Base64.encode(authString.getBytes("UTF-8"));
        authStringBase64 = authStringBase64.trim();

        connection.setRequestProperty("Content-type", "application/json; charset:utf-8");
        connection.setRequestProperty("Authorization", "Basic " + authStringBase64);

        OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
        osw.write(new String(jsonBodyString.getBytes("UTF-8"),"UTF-8"));
        osw.close();

        int responseCode = connection.getResponseCode();
        String responseMessage = connection.getResponseMessage();
        if (responseCode == 200)
            return true;


    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    } catch (ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
    return false;
}

1 Ответ

0 голосов
/ 08 декабря 2011

getBytes() без кодировки! Тебе должно быть стыдно! Ну не очень :) 1002 *

String.getBytes ()

Кодирует эту строку в последовательность байтов , используя набор символов по умолчанию , сохраняя результат в новом байтовом массиве.

Используйте взамен getBytes(String) или getBytes(Charset) - скорее всего, с UTF-8. (Подобные проблемы касаются new String(byte[]) и некоторых других методов.)

Удачного кодирования.

...