2013-06-11 23 views
6

Sto riscontrando problemi con la codifica UTF-8 mentre si inviano dati di modulo come "multipart/form-data", senza multipart/form-data tutto funziona correttamente. Ma dal momento che devo caricare i file sullo stesso post, ho bisogno di usare multipart/form-data.PHP 5.4 codifica UTP-8 multipart/form

Problema avviato dopo l'aggiornamento da PHP 5.3.x a PHP 5.4.4-14 (in bundle con Debian Wheezy), gli stessi script funzionano bene con il server di prova PHP 5.3.

  • Tutti i miei documenti sono salvati in UTF-8 e hanno tag <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">.
  • ho testato con diversi browser su diversi computer
  • mb_detect_encoding() rileva stringa inviato come UTF-8
  • ho provato AddDefaultCharset utf-8 per la configurazione di Apache.

Qui è possibile testare i miei script, è possibile copiare/incollare seguente stringa con i caratteri turchi (es stringa:. Öçşipğopüp)

http://sa.chelona.com.tr/haber-ekle.html

Ho trovato anche domanda relativa al UTF-8 text is garbled when form is posted as multipart/form-data in PHP ma raccomanda ri -installando apache/php e questo non è possibile per la mia situazione. Si tratta di un bug PHP/Apache noto?

risposta

3

sto scrivendo questo per rispondere alla mia domanda ... Spero che vi aiuterà a qualcun altro ...

se si utilizza PHP 5.4. x, l'impostazione mbstring.http_input da "auto" a "pass" può risolvere il tuo problema.

5

fare una semplice conversione da UTF-8 al Turkish Alphabet ISO-8859-9 e il problema dovrebbe essere risolto

iconv('UTF-8', "ISO-8859-9", $string); 

Esempio Ingresso: öçşipğopüp

Esempio Forma:

<form method="post" enctype="multipart/form-data" action ="self.php"> 
<input type="text" name="hello" /> 
<input type="submit" name="test" /> 
</form> 

semplice pozzetto:

var_dump($_POST['hello'],iconv('UTF-8', "ISO-8859-9", $_POST['hello'])); 

uscita

string 'öçşipğopüp ' (length=16) 
string 'öçþipðopüp ' (length=11) 
+0

Grazie per la risposta, ma i dati verranno inseriti nella tabella MySQL con il set di caratteri UTF-8, quindi convertirlo in ISO-8859-9 sarebbe un altro problema. –

0

si dovrebbe tentare di reinstallare il WAMP o XAMPP o il vostro Apache e php.and eseguire il codice sulla macchina qualcun altro con la stessa versione di PHP .se questo codice viene eseguito quindi provare per capire perché non funziona nel tuo server o controllare l'estensione file_upload nel tuo php.

0

se decommentare la riga di charset predefinita in php.ini fa qualcosa, o sarà facile da risolvere. ricorda di rimbalzare apache dopo aver cambiato.

0

Non penso che dovresti usare mb_detect_encoding per determinare la codifica in questo caso.

Se è necessario utilizzare, allora forse è necessario impostare l'ordine di rilevamento per assicurarsi che UTF-8 è più in alto nella lista, vedere http://www.php.net/manual/en/function.mb-detect-order.php

Hai impostato accept-charset del form in UTF-8 ; hai impostato la pagina originale su UTF-8: tutti i browser correnti invieranno UTF-8. HTML 5 specifica questo FWIW: http://www.w3.org/TR/2011/WD-html5-20110405/association-of-controls-and-forms.html#multipart-form-data

La stringa sarà essere UTF-8, non tentare alcuna conversione di esso, e si andrà bene.

Ma se si posta un po 'del vostro codice PHP allora forse sarà chiaro ciò che si sta cercando di fare e cosa sta andando male ...

0

Spiacente, questo è più di un'idea per una soluzione di soluzione reale , tuttavia, se tutti i metodi tradizionali hanno fallito e non è possibile reinstallare nulla, provare a convertire dai punti di codice UTF8. Qualcosa come usare una codifica base64 prima di inviare e poi decodificare in ricezione. O convertire in una stringa esadecimale e decodificare dopo aver ricevuto.

0

È necessario aggiungere intestazioni in PHP e HTML, come minuscole:

<?php header('content-type: text/html; charset=utf-8'); ?> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    </head> 
    <body> 
    <form method="post" enctype="multipart/form-data" action ="self.php"> 
     ... 
    </form> 
    </body> 
    </html> 

Ricorda: Salvare tutti i file PHP e HTML in UTF-8 senza BOM.

0

La pagina di esempio sembra corretta e i passaggi che hai preso sembrano coprire la maggior parte dei punti importanti, c'è ancora una cosa che vorrei controllare. Hai scritto che i dati sono memorizzati in un database MySql con set di caratteri UTF-8, ma questo non significa necessariamente che l'oggetto di connessione PHP funzioni anche con questo set di caratteri.

// tells the mysqli connection to deliver UTF-8 encoded strings. 
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); 
$db->set_charset('utf8'); 

// tells the pdo connection to deliver UTF-8 encoded strings. 
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8"; 
$db = new PDO($dsn, $dbUser, $dbPassword); 

Gli esempi precedenti mostrano come impostare il set di caratteri per SQLI o PDO. Preparare l'oggetto di connessione in questo modo, ti rende indipendente dalla configurazione del database, se necessario la connessione convertirà anche i dati restituiti/inviati.

Per verificare questo nella pagina, assicurarsi che il set di caratteri sia impostato, prima di inserire/interrogare il database.

0

mb_internal_encoding ("UTF-8");

Aggiungi questo codice prima della stringa ..

0

Dopo aver provato a lungo con unpack() e le proposte delle risposte qui, ho trovato un trabocchetto e forse hai lo stesso motivo per il problema di codifica.

Tutto quello che dovevo fare era fare htmlentities utilizzando utf-8 in modo esplicito:

htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8"); 

Questo è per php 5.2.xx

1

La mia versione di PHP è 5.4.45 e cambiando mbstring.http_input da auto a pass funziona molto bene Nel file php.ini viene passato il valore predefinito. Per maggiori dettagli su questa variabile puoi vedere here.

Problemi correlati