UTF-8 String

wer112

Top Contributor
Bist du dir sicher das du hiermit richtig bist?
kundennummer varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,#
Habe alles auf utf8mb4 gestellt, da ich dies laut Mitglied machen muss.
Ich würde mal testen wie es die db ohne Angabe von character set und collate es Abspeichert. Also mal die default Einstellung der db nutzen.
Ich habe mal nachgeschaut, gibt kein Default für die DB.
Lasse dir ausgeben was in der Variablen vor dem abspeichern steht. Und dann schaue was gespeichert ist. Schaue das direkt auf dem server nach ohne es in die app zu senden.
Denn hier macht die db genau die von dir geforderte Konvertierung.
Im Request kommt es ja richtig in PHP an. Aber bei dem Test, per Echo sind die Werte der Variablen dann Kaputt.
Oder wie gebe ich die am besten aus?
Desshalb musst du wissen in wechen utf es php bekommt.
Das war auch der sinn der hinter post #37 steht.
Habe den Log vom Request, kommt alles richtig an.
 

KonradN

Super-Moderator
Mitarbeiter
In einem anderen Thread hatten wir wohl mal den Code davon und auch den Link, wo er den her hatte. Aber das raus zu suchen ist mühsam.

Und ich hatte wohl zwei Mal gebeten, dass der geschriebene Request mal gepostet wird aber es gibt nur die Info, dass er ok ist. Was alles in dieses Urteil eingeflossen ist, ist dabei offen….

Die Hoffnung, hier dann mal die konkreten Daten und den konkreten Code zu bekommen, habe ich daher etwas aufgegeben …

@wer112:
Bitte poste einmal, was da bei php als Request angekommen ist. Wurden da auch die Header gezeigt? Dann könnten wir auch sicher stellen, dass der Request ok ist.

Und bitte poste den genauen ganzen Code bezüglich des Requests - dann können wir u.a. schauen, ob die Aufrufe für utf-8 tatsächlich richtig sind oder ob du da etwas falsch machst. Bei dem Content Type sind nur Zeichen verwendet worden, wo writeBytes auch das richtige UTF-8 schreiben würde aber bei Sonderzeichen dürfte es falsch sein.
@mrBrown writeBytes schreibt aber nach meinem Verständnis pro Codepoint 1 Byte - da dürfte ein Sonderzeichen doch nicht als zwei Zeichen ankommen, oder? Vielleicht habe ich aber auch einfach die Doku nicht gut genug gelesen, da auf dem Handy…
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown writeBytes schreibt aber nach meinem Verständnis pro Codepoint 1 Byte - da dürfte ein Sonderzeichen doch nicht als zwei Zeichen ankommen, oder? Vielleicht habe ich aber auch einfach die Doku nicht gut genug gelesen, da auf dem Handy…
Hast vollkommen Recht, dürfte hier nicht der ausschlaggebende Fehler sein, nur einer mehr...
 

wer112

Top Contributor
In einem anderen Thread hatten wir wohl mal den Code davon und auch den Link, wo er den her hatte. Aber das raus zu suchen ist mühsam.

Und ich hatte wohl zwei Mal gebeten, dass der geschriebene Request mal gepostet wird aber es gibt nur die Info, dass er ok ist. Was alles in dieses Urteil eingeflossen ist, ist dabei offen….

Die Hoffnung, hier dann mal die konkreten Daten und den konkreten Code zu bekommen, habe ich daher etwas aufgegeben …

@wer112:
Bitte poste einmal, was da bei php als Request angekommen ist. Wurden da auch die Header gezeigt? Dann könnten wir auch sicher stellen, dass der Request ok ist.
Habe mal mit anderen Daten gemacht(Also andere Werte gepostet)
Code:
Array
(
    [ort] => Musterstadt
    [geburtstag] => 01.01.1900
    [straße] => Musterstraße
    [modus] => privat
    [vorname] => Müllerina
    [pw] => sn.j07y0oiw9hmg8kti6i1t.xts81l0l4lrrvjrj3148ef1t8k3v3ii1631eo8pirigs10esral39üljij1sjürwe0181g0.zijü
    [name] => Müller
    [geburtsort] => Musterstadt
    [hausnummer] => 1
    [plz] => 01234
    [PHPSESSID] => b6927eeb2666b4db4478f294f52a305c
)
:

Und bitte poste den genauen ganzen Code bezüglich des Requests - dann können wir u.a. schauen, ob die Aufrufe für utf-8 tatsächlich richtig sind oder ob du da etwas falsch machst.
Mit dem Request Code(wird wieder entfeernt):
PHP:
<?php
//Entwickler Registrieren und in die Warteschlange machen
session_start();
$req_dump = print_r($_REQUEST, TRUE);
$fp = fopen('request.log', 'a');
fwrite($fp, $req_dump);
fclose($fp);

include_once("includes/utf-8.php");
require "connections/db.php";

$array = array();

$angemeldet = trim($_SESSION['angemeldet']);
$kundennummer = trim($_SESSION['kn']);

if(empty($angemeldet) or empty($kundennummer)){
   
   

    echo "Session fehler";


}else{

    if($angemeldet == 1){
        $name = trim($_POST['name']);
        $vorname = trim($_POST['vorname']);
        $geburtstag = trim($_POST['geburtstag']);
        $geburtsort = trim($_POST['geburtsort']);
        $straße = trim($_POST['straße']);
        $hausnummer = trim($_POST['hausnummer']);
        $plz = trim($_POST['plz']);
        $ort = trim($_POST['ort']);

        $modus = trim($_POST['modus']);
        $passwort = trim($_POST['pw']);


        if(empty($name) or empty($vorname) or empty($geburtstag) or empty($geburtsort) or empty($straße) or empty($hausnummer) or empty($plz) or empty($ort) or empty($modus) or empty($passwort)){
            if(empty($name))
            echo "Name";

            if(empty($vorname))
            echo "Vorname";

            if(empty($geburtstag))
            echo "Geburtstag";

            if(empty($geburtsort))
            echo "Geburtsort";

            if(empty($straße))
            echo "Straße";

            if(empty($hausnummer))
            echo "Hausnummer";

            if(empty($plz))
            echo "PLZ";

            if(empty($ort))
            echo "Stadt";

            if(empty($modus))
            echo "Modus";

            if(empty($passwort))
            echo "Passwort";
            echo "Datenübertragung nicht erfolgreich gewesen.\nBitte wenden Sie sich an den Support.\n\n";

        }else{

            if($modus == "privat"){

                //Schauen ob es schon vorhanden ist

                $stat = $con->prepare("SELECT kundennummer FROM entwickler_registrations_warteschleife WHERE vorname = :vn AND nachname = :nn AND geburtstag = :gt AND geburtsort = :geo");
                $stat->execute(array(":vn" => $vorname, ":nn" => $name, ":gt" => $geburtstag, ":geo" => $geburtsort));

                $existiert = $stat->fetch();

               

                if($existiert == false){
                    //echo "Existiert nicht.";

                    //Prüfen ob der Nutzer schon existiert
                    $statemant = $con->prepare("SELECT kundennummer FROM entwickler_profil  WHERE vorname = :vn AND nachname = :nn AND geburtsdatum = :gt AND geburtsort = :geo");
                    $statemant->execute(array(":vn" => $vorname, ":nn" => $name, ":gt" => $geburtstag, ":geo" => $geburtsort));

                    $exis = $statemant->fetch();

                    if($exis == false){
                       
                         //In den Warteschlange setzten

                        $warteStat = $con->prepare("INSERT INTO entwickler_registrations_warteschleife (kundennummer, vorname, nachname, geburtstag, geburtsort, person_type, zip_passwort) VALUES (:kn, :vn, :nn, :gt, :geo, :pt, :pw)");
                        $warteStat->execute(array(":kn" => "E" . $kundennummer, ":vn" => $vorname, ":nn" => $name, ":gt" => $geburtstag, ":geo" => $geburtsort, ":pt" => "privat", ":pw" => $passwort));

                        //Ins Profil setzen

                        $stats = $con->prepare("INSERT INTO entwickler_profil(kundennummer,  Entwicklerstuffe, berufstuffe, vorname, nachname , geburtsdatum, geburtsort, strasse, hausnummer, plz, ort, freelancer) VALUES (:kn, :es, :bs, :vn, :nn, :gd, :geo, :ss, :hn, :plz, :ort, :fl)");
                        $stats->execute(array(":kn" => "E" . $kundennummer, ":es" => 1, ":bs" => 1, ":vn" => $vorname, ":nn" => $name, ":gd" => $geburtstag, ":geo" => $geburtsort, ":ss" => $straße, ":hn" => $hausnummer, ":plz" => $plz, ":ort" => $ort, ":fl" => 1));

                        //Enwickler Modus setzen

                        //kostenlose Plätze prüfen und dann abziehen
                       
                        echo "Nutzer wurde angelegt.";
                    }else{
                        echo "Nutzer existiert bereits";
                    }

                   

               

                }else{
                    echo "Nutzer existiert bereits in der Warteschlange.";
                }

             



            }else if($modus == "unternehmen"){


            }else if($modus == "dummy"){

                echo "Dummy Typ erkannt.";
            }

        }



    }else{
       
        echo "Du bist nicht angemeldet.";
    }

}    


?>

Das Include Header:
PHP:
<?php
header('Content-type: text/html; charset=utf-8');
mb_internal_encoding('UTF-8');



//ini_set(default_charset, "UTF-8");
?>


So kommt es aber in der DB an:

Screenshot 2023-12-07 at 01-33-11 w01a7fb1.kasserver.com _ localhost _ d03864ff _ entwickler_r...png
Bei dem Content Type sind nur Zeichen verwendet worden, wo writeBytes auch das richtige UTF-8 schreiben würde aber bei Sonderzeichen dürfte es falsch sein.
@mrBrown writeBytes schreibt aber nach meinem Verständnis pro Codepoint 1 Byte - da dürfte ein Sonderzeichen doch nicht als zwei Zeichen ankommen, oder? Vielleicht habe ich aber auch einfach die Doku nicht gut genug gelesen, da auf dem Handy…
 

wer112

Top Contributor
wer112 hat gesagt.:


Ich habe mal nachgeschaut, gibt kein Default für die DB.


den Link über die Variablen habe ich dir schon gegeben. Die gibt es.
und lassen sich auch abfragen und setzen.

schaue hier.

konnte es nicht umstellen, obwohl ich es ausführen konnte
 

Jw456

Top Contributor
Ersten wollt konraf den java teil haben volley aus der app nund nicht php.

Zweitens haben wir gesagt wir wollen die daten in den Variablen wie sie im php ankomnen bevir du sie in der DB speicherst.

Wes wurde gesagt keine Schritte.
 

wer112

Top Contributor
Ersten wollt konraf den java teil haben volley aus der app nund nicht php.
Java:
RequestQueue queue = Volley.newRequestQueue(getActivity());

        StringRequest stringRequest = new StringRequest(Request.Method.POST, privat_url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
            Log.e("Free Entwickler", "Response: " + response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            Log.e("Free Entwickler", "Error: " + error);
            }
        }){

            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();

                //param.put("test", "XXÄÜXX");

                param.put("name", privat_name);
                param.put("vorname", privat_vorname);
                param.put("geburtstag", privat_geburtstag);
                param.put("geburtsort", privat_geburtsort);
                param.put("straße", privat_straße);
                param.put("hausnummer", privat_hausnummer);
                param.put("plz", privat_postleitzahl);
                param.put("ort", privat_ort);
                param.put("modus", "privat");
                param.put("pw", password);

                return param;
            }
        };

        queue.add(stringRequest);
Zweitens haben wir gesagt wir wollen die daten in den Variablen wie sie im php ankomnen bevir du sie in der DB speicherst.
den Request habe ich geschicht, sowie wie es in der DB ankommt.
Wes wurde gesagt keine Schritte.
 

wer112

Top Contributor
Die Klasse StringRequest wäre jetzt noch interessant
Java:
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.volley.toolbox;

import androidx.annotation.GuardedBy;
import androidx.annotation.Nullable;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import java.io.UnsupportedEncodingException;

/** A canned request for retrieving the response body at a given URL as a String. */
public class StringRequest extends Request<String> {

    /** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
    private final Object mLock = new Object();

    @Nullable
    @GuardedBy("mLock")
    private Listener<String> mListener;

    /**
     * Creates a new request with the given method.
     *
     * @param method the request {@link Method} to use
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public StringRequest(
            int method,
            String url,
            Listener<String> listener,
            @Nullable ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }

    /**
     * Creates a new GET request.
     *
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public StringRequest(
            String url, Listener<String> listener, @Nullable ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

    @Override
    public void cancel() {
        super.cancel();
        synchronized (mLock) {
            mListener = null;
        }
    }

    @Override
    protected void deliverResponse(String response) {
        Response.Listener<String> listener;
        synchronized (mLock) {
            listener = mListener;
        }
        if (listener != null) {
            listener.onResponse(response);
        }
    }

    @Override
    @SuppressWarnings("DefaultCharset")
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            // Since minSdkVersion = 8, we can't call
            // new String(response.data, Charset.defaultCharset())
            // So suppress the warning instead.
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }
}
 

Jw456

Top Contributor
Hallo
Für mich ist der Code von Volley voll OK sehe da keinen Fehler.

Ich konnte deinen Fehler bei mir auch nicht nachstellen. Ich habe mal ein Volley StringRequest gemacht so wie du. Erstens kamen die Daten korrekt im PHP an und wurden auch korrekt wieder mit Echo so wie in Post #13 als Respons verschickt.

Hast du auch android:usesCleartextTraffic="true" im Manifest eingestellt ?



Auch wurden sie Daten bei mir korrekt in der DB abgespeichert.
Frage welchen PHP Freehoster benutzt du?
Zeige mal in PHP wie du die Verbindung zu DB machst welche API benutzt du da?
Du hast PHP 7 da sollte man die alte API mysql nicht mehr nutzen sondern mysqli.
Zeige mal mit PhpMyAdmin wie deinen DB eingestellt ist.



Ich habe es lokal mit Xampp getestet.


Java:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendRequest();
    }

    void sendRequest() {
        RequestQueue queue = Volley.newRequestQueue(this);
        String privat_url = "http://192.168.0.112/api/db-insert.php";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, privat_url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.e("Free Entwickler", "Response: " + response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Free Entwickler", "Error: " + error);
            }
        }) {

            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();
                param.put("name", "XXÄÜXX");
                param.put("vorname", "XXöÄܲ³XX");
                return param;
            }
        };
        queue.add(stringRequest);
    }
}


Code:
<?php
// Datenbank-Verbindung herstellen

$username="";
$password="";
$database="utf8-db";

$db_link = new mysqli("localhost", $username, $password, $database);
if ($db_link -> connect_error) {
    die('Verbindung fehlgeschlagen: ' . mysql_error());
}



// MySQL-Befehl der Variablen $sql zuweisen
$sql = "
    CREATE TABLE `adressen` (
    `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `nachname` VARCHAR( 150 ) NOT NULL ,
    `vorname` VARCHAR( 150 ) NULL ,
    `akuerzel` VARCHAR( 2 ) NOT NULL ,
    `strasse` VARCHAR( 150 ) NULL ,
    `plz` INT( 5 ) NOT NULL ,
    `telefon` VARCHAR( 20 ) NULL
    ) ENGINE = MYISAM ;
    ";

// MySQL-Anweisung ausführen lassen
$db_erg = mysqli_query($db_link, $sql)
  or die("Anfrage fehlgeschlagen: " . mysqli_error());
?>

Code:
<?php
// Datenbank-Verbindung herstellen

$username="";
$password="";
$database="utf8-db";

$db_link = new mysqli("localhost", $username, $password, $database);
if ($db_link -> connect_error) {
    die('Verbindung fehlgeschlagen: ' . mysql_error());
}



  $name = trim($_POST['name']);
  $vorname = trim($_POST['vorname']);

 

$sql = "
  INSERT INTO `adressen`
  (
  `id` , `nachname` , `vorname` , `akuerzel` , `strasse` ,
  `plz` , `telefon`
  )
  VALUES
  (
  NULL ,'$name', '$vorname', 'm', NULL , '72070', '07071-77..'
  );
";
$db_erg = mysqli_query($db_link, $sql)
   or die("Anfrage fehlgeschlagen: " . mysqli_error());


?>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Base64 konvertierter URI String Android & Cross-Platform Mobile Apps 32
W String Array Pfad in Int setzen Android & Cross-Platform Mobile Apps 54
W Volley String Response gibt falchen if aus Android & Cross-Platform Mobile Apps 35
H Anfänger String types not allowed (at 'textColor' with value 'black' Android & Cross-Platform Mobile Apps 13
W Firestore String in Apps Laden Android & Cross-Platform Mobile Apps 10
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
A Mit Java neues item in ein string-array einer Strings.xml schreiben Android & Cross-Platform Mobile Apps 4
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
J Android String in andere Java-Dateien überführen Android & Cross-Platform Mobile Apps 1
J R.string.(variable) geht das Android & Cross-Platform Mobile Apps 3
R Android incomingNumber bein Eingehenden Anruf immer leerer String Android & Cross-Platform Mobile Apps 4
S SPLIT funktion bei STRING funktioniert nicht! Android & Cross-Platform Mobile Apps 4
G String an einen php Script senden Android & Cross-Platform Mobile Apps 8
J Plötzlich "java.lang.String cannot be converted to JSONObject" Android & Cross-Platform Mobile Apps 9
T int to string ... Android & Cross-Platform Mobile Apps 8
A String[] für Lisadapter Android & Cross-Platform Mobile Apps 4
M jsonobject cannot be cast to java.lang.string Android & Cross-Platform Mobile Apps 4
N Android Hilfe string to float geht nicht... Android & Cross-Platform Mobile Apps 4
J Einen String bewegen wie? Android & Cross-Platform Mobile Apps 3
R String wie WAV Datei nutzen Android & Cross-Platform Mobile Apps 4
C 2 kleine Probleme (Datei lesen, String durchsuchen) Android & Cross-Platform Mobile Apps 16
L String dem Display anpassen Android & Cross-Platform Mobile Apps 12
G Text parsen String to Double Android & Cross-Platform Mobile Apps 2
S ein String nach vorgegebenen Zeichen teilen Android & Cross-Platform Mobile Apps 3
N Zeichen im String löschen? Android & Cross-Platform Mobile Apps 18
M MIDlet + Datum in String Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen

Neue Themen


Oben