Jak konwertować String na UTF-8 short string

0

W Delphi użyłem UTF8EncodeToShortString i działa ja trzeba. Ale w Java na Android mi nie wychodzi.

W skrócie: tworzę pakiet HTTP/XML w którym tekst: planetę.mp4 musi być zapisane w HEX: 70 6c 61 6e 65 74 c4 99 2e 6d 70 34 (pakiety podglądam w Wireshark).

Poniżej zapis prawidłowy w którym serwer dobrze rozpoznaje znaki specjalne:

//0120   3c 66 69 6c 65 4e 61 6d 65 3e 4a 61 6b 20 7a 61   <fileName>Jak za
//0130   62 69 c4 87 20 70 6c 61 6e 65 74 c4 99 2e 6d 70   bi.. planet...mp
//0140   34 3c 2f 66 69 6c 65 4e 61 6d 65 3e 3c 2f 55 70   4</fileName></Up

Używając:

String nazwa_pliku_UTF8 = URLEncoder.encode(nazwa_pliku, "UTF-8");

otrzymam w pakiecie w HEX:

//03e0   61 6d 65 3e 4a 61 6b 2b 7a 61 62 69 25 43 34 25   ame>Jak+zabi%C4%
//03f0   38 37 2b 70 6c 61 6e 65 74 25 43 34 25 39 39 2e   87+planet%C4%99.
//0400   6d 70 34 3c 2f 66 69 6c 65 4e 61 6d 65 3e 3c 2f   mp4</fileName></

czyli nie to co trzeba. Serwer potraktuje zapis %C4%99 dosłownie, nie jako literę ę.

Pakiet wysyłam poniższą funkcją, gdzie String XML to ten w którym są znaki specjalne:

    public String DownloadToStreamBOX(String adresURL, String XML, String SOAP) {

        Log.i(TAG, "Start DownloadToStreamBOX " + adresURL + " " + XML + " " + SOAP);

        URL url;
        HttpURLConnection connection = null;

        try {
            //Create connection
            url = new URL(adresURL);

            connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("SOAPAction", SOAP);
            connection.setRequestProperty("User-Agent", BOX_UserAgent);
            connection.setRequestProperty("Keep-Alive", "300");
            connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
            connection.setRequestProperty("Accept-Language", "pl-PL,en,*");
            connection.setRequestProperty("Accept-Encoding", "gzip");
            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);

            // Wstawienie cookies z managera do tego pakietu
            if (Global.cookieManager.getCookieStore().getCookies().size() > 0) {
                connection.setRequestProperty("Cookie", TextUtils.join(";",  Global.cookieManager.getCookieStore().getCookies()));
            }

            //Send request
            DataOutputStream wr = new DataOutputStream (connection.getOutputStream ());
            // Tu dodajemy znacznik końca lini \n w hex 0A
            wr.writeBytes(XML+"\n");
            wr.flush ();
            wr.close ();

            //Get Response
            InputStream inStreamGZIP;
            Log.i("response", "code="+connection.getResponseCode());
            if (connection.getResponseCode()<=400){
                inStreamGZIP = new GZIPInputStream(connection.getInputStream());
            } else {
                /* error from server */
                inStreamGZIP = connection.getErrorStream();
                Log.i("Files", "Niespodziewana odpowiedź z serwera code=" +connection.getResponseCode());
                trwa_upload = false;
            }

            BufferedReader rd = new BufferedReader(new InputStreamReader(inStreamGZIP));
            String line;
            StringBuilder response = new StringBuilder();
            while((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();
            Log.i("response", ""+response.toString());
            return response.toString();

        } catch (Exception e) {
            Log.e("error https", "", e);
            return null;
        } finally {
            if(connection != null) {
                connection.disconnect();
            }
        }
    }

Zapewne wystarczy jakaś prosta instrukcja, ale jako niedzielny programista :-) na razie nic nie wykombinowałem.

2

String na utf8 konwertujesz używając xml.getBytes(StandardCharsets.UTF_8);

0
lukascode napisał(a):

String na utf8 konwertujesz używając xml.getBytes(StandardCharsets.UTF_8);

Dzięki, działa. Tylko mały problem, bo potrzebuje >= Build.VERSION_CODES.KITKAT a kod musi działać też pod JELLY_BEAN.

Rozwiązanie znalazłem już tutaj: https://stackoverflow.com/a/19470896/6715668

    public String konwertuj_na_UTF8_short (String str) {

        byte[] b1 = new byte[0];
        try {
            b1 = str.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        String szUT8 = null;
        try {
            szUT8 = new String(b1, "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return szUT8;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1