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.