2016-05-05 20 views
1

Ich habe folgendes Problem, das scheint keine Lösung zu haben und ich bin absolut angewidert.utf8_encode codiert keine Sonderzeichen ě/š/č/ř/ž/ý/á, usw.

Ich habe Android-Anwendung, wo Benutzer Datei auf meinen Server hochladen können und dann können sie auf sie zugreifen. Also, wenn Benutzer sein Konto öffnet, verwendet diese Anwendung die Funktion scandir() und auf meinem Server verwende ich die Methode json_encode(), um Daten an meine App zu senden, um ihm seine Dateien und Ordner anzuzeigen. Und hier ist das Problem:

Wenn einige Benutzer zum Beispiel Uploads mit Sonderzeichen-Datei (Válcování stupHovitých vzorko za tepla.pptx) und diese Datei ist nicht utf-8 codiert ist, dann kann ich es nicht passieren über Json_encode, weil ich UTF-8 Fehler bekomme. Also habe ich versucht, Methode uf8_encode() für jeden Dateinamen zu verwenden und es hat funktioniert, ABER wenn es eine Datei oder einen Ordner mit Sonderzeichen wie //////////// usw. gibt und benutze Methode utf8_encode() drauf dann bekomme ich etwas Durcheinander in meiner Anwendung und anstatt Ordner mit Namen zu bekommen č, bekomme ich den Namen Ä.

Ich versuchte fast alles von htmlspecialchars() bis iconv(), aber ich kann keine Methode finden, die mir Dateien und Ordner auf meinem Server mit Eigennamen zurückgibt.

+0

Die utf-8-Codierung von 'è' ist 'c4 8d'. Wenn Sie "Ä" erhalten, ist es wahrscheinlich, dass * utf-8 kodiert ist, aber Sie behandeln es nicht so. Der Unicode für 'Ä' ist 'c4'. – fishinear

Antwort

1

Ja, tut es nicht. The doc lautet:

utf8_encode - Codiert eine ISO-8859-1 String in UTF-8

nicht sicher, was es codiert ist, aber es ist definitiv nicht ISO-8859-1.

Sie müssen mb-convert-encoding verwenden, um zwischen beliebigen Kodierungen zu konvertieren. Z.B.

$utfStr = mb-convert-encoding('č/š/ě/ř/ž/á/ý/í/é', 'UTF-8', 'ISO-8859-15') 

Wenn Sie nicht Client-Codierung wissen, müssen Sie möglicherweise mb_detect_encoding verwenden, die nicht immer funktionieren kann, oder genau sein.

Um dieses Chaos zu vermeiden, würde ich empfehlen, es anders herum zu tun und utf-codierten Dateinamen von Ihrer Android-App zu senden, anstatt es serverseitig zu konvertieren.

+0

Vielen Dank für die Antwort, Senden utf-kodierten Dateiname von Android App ist eine gute Idee, aber wenn ich versuche, es in meiner Android-App zu verschlüsseln, kann ich immer noch nicht den richtigen Dateinamen auf meinem Server, verwende ich diesen Code : outputStream.writeBytes ("Content-Disposition: Formulardaten; Name = \" uploadedfile \ "; Dateiname = \" "+ DateiP + File.separator + URLEncoder.encode (Dateiname," UTF-8 ") +" \ "" + lineEnd); Anstatt diesen Dateinamen zu erhalten: Válcování stupňovitých vzorků za tepla.pptx, bekomme ich das: V% C3% A1lcov% C3% A1n% C3% AD + %%% C% BD%%%% BD% C3% BD% AF + za + tepla.pptx – Adam

+0

Es ist perfekt URL-codierte utf8 Zeichenfolge. z.B. '% C3% A1' Teil steht für U + 00E1 (hex C3A1) Zeichen" á ". Ein http-Server sollte es url-decodieren, und es sollte als normale utf8-Zeichenfolge in PHP erscheinen. Wenn Sie eine URL-codierte Zeichenfolge in PHP erhalten, ist es wahrscheinlich, dass Sie sie in Ihrer mobilen App doppelt codieren. Ich würde empfehlen, es dort zu reparieren. Wenn es nicht machbar ist, können Sie einfach [urldecode] (http://php.net/manual/en/function.urldecode.php) es in PHP. –

+0

Vielen Dank! Du hast wahrscheinlich mein Leben gerettet :) – Adam