Visualizzazione risultati 1 fino 11 di 11

Discussione: Problema visualizzazione caratteri accentati

  1. #1
    Guest

    Predefinito Problema visualizzazione caratteri accentati

    Salve a tutti, probabilmente avrete letto questo problema migliaia di volte e so che sarebbe un problema di charset, tuttavia non sono in grado di visualizzare caratteri accentati prelevati da database tramite PHP.

    La visualizzazione in pagina risulta con un punto interrogativo contenuto in un rombo, mentre la gestione tramite PHP AJAX va in crash perché la codifica JSON fallisce.

    La codifica può fallire solo perché un carattere non è UTF-8, ma la cosa strana è che io ho settato UFT-8 dappertutto. Tutti i codici HTML sono in UTF-8 essendo presente il tag <meta charset="UTF-8" /> nell'header. Tutto nel database è settato in UTF-8. Tra l'altro ci ho messo mezza giornata solo per cambiare le proprietà di codifica di tutti i campi di testo, non capisco per quale motivo in phpMyAdmin ci sia settato di default il latin_swedish_ci. Non sarebbe meglio avere utf-8 in predefinito?

    Ho aggiunto la stringa charset=utf-8 alla variabile PDO di connessione al database:
    Codice:
    new PDO("mysql:host=$servername;dbname=$database;charset=utf8", $username, $password);
    Ho provato e riprovato ad aggiornare il record temendo che in esso fosse salvato qualche carattere pregresso in un formato diverso.

    Niente da fare, non riesco in alcun modo a visualizzare caratteri accentati.

    Cosa posso fare? Grazie.
    Ultima modifica di hierarchyvintage : 10-02-2018 alle ore 16.50.08

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    1)La pagina html
    Codice HTML:
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    /php header di default o che sovrascrive in utf-8 (fa si che invia i dati in utf-8 si ricorda che questo ha la precedenza rispetto al meta elemento che comunque se presente non può specificare una codifica diversa rispetto all'intestazione http)
    2)la pagina che riceve deve essere in utf-8
    3)il database e tutto il resto deve essere in utf-8
    4)la connessione al database deve essere in utf-8..
    5)opzionalmente puoi usare il contentype appropriato per la ricezione di un file json.. (Ovviamente il browser deve supportare questo mime type).
    Con php 5.6 in automatico imposta un header utf-8.. Si veda default mime type e default charset http://php.net/manual/en/ini.core.ph...fault-mimetype
    Puoi provare ad inserire un nuovo dato per come ti ho elencato sopra? http://forum.it.altervista.org/php-m...ml#post1371152
    Ultima modifica di darbula : 10-02-2018 alle ore 18.36.31

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    1)La pagina html
    Codice HTML:
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    /php header di default o che sovrascrive in utf-8 (fa si che invia i dati in utf-8)
    2)la pagina che riceve deve essere in utf-8
    3)il database e tutto il resto deve essere in utf-8
    4)la connessione al database deve essere in utf-8..
    5)opzionalmente puoi usare il contentype appropriato per la ricezione di un file json.. (Ovviamente il browser deve supportare questo mime type).
    Con php 5.6 in automatico imposta un header utf-8.. Si veda default mime type e default charset http://php.net/manual/en/ini.core.ph...fault-mimetype
    Puoi provare ad inserire un nuovo dato per come ti ho elencato sopra? http://forum.it.altervista.org/php-m...ml#post1371152
    1) La pagina HTML ha il charset utf-8 impostato nell'header. Il file stesso, scritto con Atom, è salvato in UTF-8.
    L'header della pagina PHP non l'ho toccato, dunque dovrebbe essere UTF-8, sarebbe preoccupante il contrario.
    2) La pagina che riceve è in UTF-8.
    3) Il database è tutto in UTF-8.
    Codifica caratteri del server: UTF-8 Unicode (utf8) (default).
    Collation della connessione del server: utf8mb4_unicode_ci (default).
    Ogni campo di testo ha codifica caratteri utf8_unicode_ci (non default).
    4) La variabile PDO di connessione al database contiene il parametro charset=utf-8, dunque la connessione è in UTF-8.
    5) Non so di cosa si tratta, ma il JSON io lo ottengo sottoforma di stringa, e in ogni caso, il problema sta a monte. Se ricevo dati sconosciuti, la codifica in JSON sarà comunque errata perché non è contemplata in presenza di dati non UTF-8.

    Capisco che il PHP imposti un header uft-8 di default, ma in phpMyAdmin se vai a creare un nuovo campo di testo in una qualsivoglia tabella, la codifica carattere di default è latin_swedish-ci. Ora, magari sarà la stessa cosa e non costituisce un problema, ma perché non impostare di default utf8_unicode_ci così come in tutto il resto? Comunque io ho cambiato tutti i campi in utf8, operazione molto laboriosa tra l'altro.

    Ho cancellato il record incriminato e l'ho reinserito. Continua a non vedersi il carattere accentato e sono costretto a usare l'apostrofo altrimenti un'intera pagina mi risulta invisibile perché il PHP non invia nulla a causa del fatto che non si riesce a codificare niente in JSON.

    Quel topic l'ho già letto. Lui ha risolto impostando il charset UTF-8 nella connessione al database, io l'ho già fatto con la riga di codice postata nell'open post utilizzando il PDO, ma i caratteri accentati continuano a dare problemi.
    Ultima modifica di hierarchyvintage : 10-02-2018 alle ore 18.59.41

  4. #4
    L'avatar di alemoppo
    alemoppo è connesso ora Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,187

    Predefinito

    Da qualche parte i caratteri vengono convertiti in un altro charset, dovresti provare a controllare passo passo dove avviene la conversione. Se le tabelle non sono piene di dati, puoi provare a ricrearle? (in utf-8?)

    Ciao!
    Ultima modifica di alemoppo : 11-02-2018 alle ore 00.03.40

  5. #5
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    @hierarchyvintage tento di aiutarti per la seconda volta..
    1.a)Crea una nuova tabella1 e un campo e scegli utf8_general_ci come codifica caratteri.
    1.b)Crea una nuova tabella2 e un campo e scegli utf8_general_ci come codifica caratteri
    2.a)inserisci i caratteri utf-8 da phpmyadmin per tabella1
    2.b)Crea uno scrip php che deve inserire con connessione al database e header("Content-type: text/html; charset=utf-8"); in utf-8 per tabella2
    3)visualizza i dati del database con connessione al database e header("Content-type: text/plain; charset=utf-8"); in utf-8 tramite script 1 (dati da phpmyadmin) e script 2 (che sono stati inseriti dal tuo php)..
    Ultima modifica di darbula : 11-02-2018 alle ore 21.50.55

  6. #6
    Guest

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Da qualche parte i caratteri vengono convertiti in un altro charset, dovresti provare a controllare passo passo dove avviene la conversione. Se le tabelle non sono piene di dati, puoi provare a ricrearle? (in utf-8?)

    Ciao!
    Ricrearle da capo non ci penso proprio, ho troppe relazioni tra chiavi di tabelle diverse che dovrei cancellare anche altre tabelle. Se devo fare tutto questo, tanto vale che le ricreo tutte su un altro host.

    Comunque non credo che ci sia nemmeno bisogno di ricreare le tabelle dato che phpMyAdmin mi dice che sono in UTF-8.
    Ho provato a cancellare tutti i dati e a reinserirli (dopo averli esportati in locale), ma succede sempre lo stesso, i caratteri accentati non si vedono e alcune pagine vanno in crash.

    Ormai ci rinuncio, rispondo anche a @darbula, francamente non posso perdere troppo tempo dietro questa sciocchezza. Se imposto tutto in UTF-8 (e ricordo che in predefinito per i singoli campi non lo è perché di default i testi vengono settati in latin_swedish, questa cosa qualcuno dovrebbe spiegarmela perché non ha senso) e alle pagine PHP vengono forniti caratteri strani, il problema non può essere mio.

    Peccato, lavorerò senza accenti e quando il sito sarà a buon punto, passerò tutto su un altro host.

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Perché è MySQL che impone tale regola come predefinito https://dev.mysql.com/doc/refman/5.7...t-we-sets.html e il database è in latin1_swedish_ci in altervista (per ragioni di sicurezza non è possibile modificare il database predefinito).
    Cmq. possiamo aiutarti solo se esegui i test che ti proponiamo altrimenti sarebbe per via di numerosi tentativi..
    Se hai difficoltà nel scrivere il codice ti forniamo noi un esempio se qualcosa non ti è chiaro..
    Ultima modifica di darbula : 11-02-2018 alle ore 21.48.27

  8. #8
    L'avatar di alemoppo
    alemoppo è connesso ora Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,187

    Predefinito

    Purtroppo senza codice è difficile, se non impossibile valutare dove possa essere il problema.
    Ho fatto una prova con PDO e json e sembra tutto funzionante.

    Se proprio non riesci a risolvere, puoi convertire i charset tramite le utf8_encode() o utf8_decode()

    Ciao!

  9. #9
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ci tento per la terza volta ad aiutarti..
    Quello che segue è un esempio senza collate esplicito di MySQL bisogna solo cambiare con il vostro my_nick ed ovviamente non dovrà esistere tabella2.
    Codice PHP:
    <?php
    //>=php 5.3.6
    try {
    $user = '';
    $pass = '';
    $db = 'my_nick';
    $dbh = new PDO("mysql:host=localhost;dbname=$db;charset=utf8", $user, $pass);
    $dbh->exec("CREATE TABLE IF NOT EXIST `$db`.`tabella2` (
    `campo` varchar(6) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8"
    );
    $stmt = $dbh->prepare("INSERT INTO `$db`.`tabella2` (`campo`) VALUES (:value)");
    $stmt->bindParam(':value', $value, PDO::PARAM_STR, 6);
    $value = "\xC3\xA0".'bc';
    $stmt->execute();
    foreach(
    $dbh->query('SELECT `campo` from `tabella2`',PDO::FETCH_ASSOC) as $row) {
    header('Content-type: text/plain; charset=utf-8');
    print_r($row);
    }
    $dbh = null;
    } catch (
    PDOException $e) {
    print
    "Error!: " . $e->getMessage() . "\n";
    die();
    }
    ?>
    Questo codice funziona a partire da php 5.3.6. , questa sintassi "\xC3\xA0" è il carattere à che uso per prevenire che il file php sia salvato con un diverso enconing e fa visualizzare che quel carattere corrisponde a due bytes..
    @alemoppo puoi confermare che se da phpmyadmin crei tabella1 e scegli utf8_general_ci (per la tabella e poi il campo dovrebbe importare tale codifica), crei un campo dopo successivamente inserisci àbc riesci a visualizzarlo solo da phpmyadmin? Mentre se lo visualizzi con il mio script ti appare un rombo? Semplicemente i dati sono inseriti in LATIN1

  10. #10
    Guest

    Predefinito

    Ho aperto uno spazio su un altro servizio hosting, ho settato tutto in utf8mb4 e non ho alcun problema con i caratteri accentati. Dunque il problema, come avevo accennato, riguarda la codifica di MySQL su Altervista.

    Ciao.

  11. #11
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Solo se inserisci i dati da phpmyadmin altrimenti tramite script php e con le dovute impostazioni funziona tutto..
    Grazie per la segnalazione :)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •