Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Android POST data a kódování

Chvilku jsem váhal, jestli tento dotaz vůbec pokládat, jestli bude zodpovězen, ale řekl jsem si nakonec jo.

Posílám z aplikace v Javě v Androidu data na PHP server:

Jde v podstatě o ekvivalent políčka ve formuláři v HTML.
Zde se políčko jmenuje NAME a má hodnotu : Kulaťoučký pes pěl strašné ódy

 

int serverResponseCode = 0;

            HttpURLConnection connection;
            DataOutputStream dataOutputStream;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";


            int bytesRead,bytesAvailable,bufferSize;
            byte[] buffer;
            int maxBufferSize = 1 * 1024 * 1024;
            File selectedFile = new File(selectedFilePath);


            String[] parts = selectedFilePath.split("/");
            final String fileName = parts[parts.length-1];

 FileInputStream fileInputStream = new FileInputStream(selectedFile);
                    URL url = new URL("http://mujServerPHP/uploadFile.php");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);//Allow Inputs
                    connection.setDoOutput(true);//Allow Outputs
                    connection.setUseCaches(false);//Don't use a cached Copy
                    connection.setRequestMethod("POST");
                    connection.setRequestProperty("Connection", "Keep-Alive");
                    connection.setRequestProperty("ENCTYPE", "multipart/form-data");
                    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                    connection.setRequestProperty("uploaded_file",selectedFilePath);
                                        //creating new dataoutputstream
                    dataOutputStream = new DataOutputStream(connection.getOutputStream());


dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + "Name" + "\""+ lineEnd);
dataOutputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
dataOutputStream.writeBytes(lineEnd);
dataOutputStream.writeBytes("\"Kulaťoučký pes pěl strašné ódy\"" + lineEnd);
dataOutputStream.flush();

Příklad funguje OK, jen mrší diakritiku, pokud se vyskytuje.
Jak prosím zjistím v jakém kódování to je a jak to vlastně opravím?

Na serveru to zapisuji takto do souboru:

file_put_contents ("uploads/peklo.txt", utf8_encode($_POST['Name']));
Předmět Autor Datum
Keď si prečítate dokumentáciu k funkcii writeBytes, ktorá berie ako parameter String, tak uvidíte, ž…
moose 27.11.2017 05:06
moose
Díky
Flash_Gordon 27.11.2017 09:55
Flash_Gordon
Pokud jsem to ale dobře pochopil, tak když použiji dataOutputStream na odeslání dat na server, tak t…
Flash_Gordon 27.11.2017 17:00
Flash_Gordon
Prečo by to malo byť v základnom kódovaní? Keď použijete metódu na odosielanie bajtov a tie bajty bu… poslední
moose 28.11.2017 04:04
moose
Proc nepouzijes HttpClienta a prasis to takhle?
MaSo 27.11.2017 14:52
MaSo
Protože to mám založené pro nižší verzi androidu a tam to nezná. Viz.
Flash_Gordon 27.11.2017 15:55
Flash_Gordon
Pro nizsi? HttpClient prave neni v tech vyssich. Ale stejne se tam da pridat...
MaSo 27.11.2017 17:48
MaSo

Keď si prečítate dokumentáciu k funkcii writeBytes, ktorá berie ako parameter String, tak uvidíte, že z každého znaku zahadzuje horných 8 bitov, takže je to dobré maximálne na 8-bitové kódovania. DataOutputStream má ešte zavádzajúcu metódu writeUTF, ktorá používa modifikované (=zmršené) UTF-8 kódovanie. Najlepšie bude asi použiť metódu write a bajty získať volaním String.getBytes s uvedením štandardného kódovanie UTF-8. S Androidom nerobím, ale snáď tieto základné API podporuje normálne.

Volať na strane PHP funkciu utf8_encode nemá zmysel. Slúži na prekódovanie vstupu z ISO-8859-1 do UTF-8. Vstup bude v UTF-8, takže ďalšie prekódovania nie sú potrebné.

Zpět do poradny Odpovědět na původní otázku Nahoru