Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617

    Mysql e lettere accentate!

    Salve raga, è da un po' che im stò cimentando nella creazione del mio primo database con mysql e per non perdermi(almeno per cominciare) tra le varie stringhe di comando ho optato per l'utilizzo di php admin che esce assieme ad easyphp 3.0.
    Posso dire che va tutto bene, estraggo i dati dal database e li piazzo come mi garbano all'interno di un div in un foglio php.Ho solo un problema, le lettere accentate vengono sostituite da caratteri strani(un rombo con dentro un punto interrogativo).
    Ho letto un po' in giro e si parla di cambiare la codifica del campo text in utf8.Ora, utf8 non esiste, esistono altri utf8, li ho praticamente provati tutti(anche il turco), ma la situazione non cambia, come faccio a far vedere queste maledette lettere con l'accento?
    Help please, è l'unica cosa che mi manca per essere sufficientemente soddisfatto di ciò che ho imparato!

  2. #2
    I database come MySQL hanno 2 opzioni relative alla codifica. Quando crei il database, le tabelle e i singoli campi testo (char, varchar, text, ecc.) puoi impostarle diversamente. Se non lo fai, basta che imposti queste due opzioni a livello di database e tutto quello che c'è sotto le eredita (le tabelle dal database e i campi testo dalle tabelle). Detto questo, UTF-8 esiste in MySQL. Le opzioni da considerare sono:

    CHARACTER SET uft8
    COLLATION utf8_general_ci (non esiste una collazione _cs, ovvero case sensitive)

    Quindi, per creare un database in cui tutte le tabelle e tutti i campi testo usano UTF-8 devi scrivere:

    CREATE DATABASE [nomedatabase] CHARACTER SET utf8 COLLATION utf8_general_ci;

    Poi devi pensare alle pagine web che leggono le tabelle. Perché le pagine siano in UTF-8 (senza BOM mi raccomando!) devono avere entrambe queste caratteristiche:

    1. Avere dichiarato il Content-Type (tramite meta tag) con charset=UTF-8.
    2. Essere salvate con la codifica UTF-8. Questo lo puoi fare solo con un editor che supporta il salvataggio in codifiche differenti. Ad es., il Blocco note di Windows salva per default in ANSI, ma nella finestra Salva con nome puoi impostare la codifica a UTF-8.

    Tieni anche conto che se insierisci i valori manualmente da riga di comando e provi a visualizzarli tramite pagine web, potresti avere comunque una rappresentazione errata (perché MySQL ha usato il Latin1 per la connessione). In questo caso, è utile approntare una pagina web in UTF-8 con un form per l'inserimento e la modifica dei dati. Inserendoli e modificandoli da questo form, i dati saranno letti e visualizzati sempre correttamente. In teoria, potresti comunque inserire i dati da linea di comando forzando la connessione ad usare UTF-8 al posto di Latin1 col comando SET NAMES. Tuttavia non te lo consiglio...almeno a me dava problemi quando tentavo di inserire stringhe con lettere accentate.

  3. #3
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Supponiamo di avere un file di backup in cui i dati presentano gli errori sulle lettere accentate, tipo quelle starne lettere A, esiste un sistema per correggere questi caratteri? Magari si potrebbe fare uno script che risolva il tutto con str_replace.

    Non vorrei sbagliarmi, ma mi pare che qualcuno lo aveva già postato in questo forum ma non ritrovo più il post.
    Errare humanum est, perseverare ovest

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617
    Non riesco a capire il character set dove cavolo appiopparlo, per me c'è solo collation(ricordo che uso phpadmin).

    Volevo aggiungere che uso dreamweaver cs3 quindi il meta tag è impostato in automatico su uno charset utf8 e che quando dicevo che non c'era utf8 in realtà mi sono espresso male.Infatti mi riferico al fatto che non esiste(almeno in questo phpadmin o cmq per quello che vedo io) un utf8 così come ve l'ho scritto ma esistono tutte cose simili(es:utf8_general_ci,utf8_bin,utf8_esperando_ ci ecc.).
    Provo a spiegarvi come è impostato il campo, magari capite dove dovrei mettere le mani:
    Campo:notizie
    Tipo:varchar,chat o text(li ho provati tutti)
    Lunghezza/set:150
    Predefinito(non so cosa significhi):Nessuno(sotto la tendina c'è NULL e TIMESTAMP)
    Collation:utf8_general_ci
    Attributi
    Null
    A_I
    Commenti

    Io il campo l'ho impostato come sopra riportato, ma anche se cambio il collation, non cambia mai nulla, le lettere accentate non si vedono e non capisco perchè.
    Help please!

    Grazie anticipatamente.

  5. #5
    Se è impostata la collation in automatico da phpmyadmin su utf8_general_ci anche il character set è corretto (utf8). La collation corretta è quindi utf8_general_ci ed è già impostata. Non devi modificarla con altre.

    Per il resto, non uso phpmyadmin e dreamweaver, perché faccio tutto a mano e da riga di comando, quindi non li conosco approfonditamente. Posso però consigliarti di:

    1. Controllare che la tua versione di phpmyadmin non lavori in Latin1. E' un problema comune di molti di quei software impostare il charset delle pagine a ISO-8859-1 (Latin1). Se è così, i caratteri particolari non li vedrai MAI correttamente da phpmyadmin (ma dalle tue pagine web sì se imposti la codifica corretta).

    2. Dreamweaver salva i file in UTF-8? Penso di sì ovviamente, perché NON basta che ti imposti il meta tag Content-Type con charset=UTF-8. Devi controllare se il file di testo della pagina è salvato effettivamente in UTF-8. Puoi usare un qualsiasi editor di testo che supporta il salvataggio in UTF-8 (senza BOM) e provare ad aprire il file e a risalvarlo forzandone la codifica (penso che anche il semplice Blocco note di Windows basti).

    3. Se i dati inseriti nel database sono stati inseriti da riga di comando o da un form (come quelli di phpmyadmin) di una pagina codificata in Latin1, saranno molto probabilmente in forma errata. Per provare, creati una pagina con un form che inserisca un dato in un campo di testo di una tabella e assicurati di averla salvata in UTF-8. Quindi prova ad inserire dei caratteri particolari e quindi a leggerli dal database usando la stessa pagina. Se tutto è stato fatto correttamente, dovresti vedere i caratteri senza problemi.

    4. Controlla anche le proprietà della tabella MySQL dove hai i tuoi campi. Non so se phpmyadmin te lo dica, ma forse ti informa se la tabella usa un character set differente, che quindi non eredita dal database (che si suppone sia in UTF-8, avendo la collation impostata giusta).

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617
    Vorrei specificare una cosa, io i caratteri accentati li vedo in maniera corretta all'interno del database li vedo male solamente quando li riporto nella pagina php che richiama tale database.
    Io ho cercato di salvare la pagina con una codifica diversa ma non mi pare si possa fare, o almento non trovo un opzione per tale cosa!
    Ho anche provato a inserire le variabili php per caratteri speciali tipo htmlspecialchar ma non mi pare finzionare!

  7. #7
    Per curiosità: hai detto che i caratteri li vedi bene all'interno del database. Ma con cosa li guardi? Voglio dire: usi phpmyadmin o lo fai da riga di comando della console di MySQL? Perché se lo fai dalla console (facendo una SELECT) dovresti vederli "male". Se da console di vedi bene, sono stati inseriti con una codifica probabilmente differente e quando vengono letti da una pagina UTF-8 vengono ovviamente "scombinati".

    Se inserisci i dati usando htmlspecialchars() dovresti avere i caratteri speciali &, < e > (e anche ' e " se usi ENT_QUOTES o ENT_COMPAT come secondo argomento) convertiti in entità. Ma tutti gli altri caratteri speciali (accentate, ecc.) NON sono tradotti. Se vuoi tradurli, devi usare htmlentities(), non htmlspecialchars(). Tuttavia te lo sconsiglio per 2 motivi:

    1. Avendo pagine e database in UTF-8, non ha senso convertire in entità i caratteri speciali.
    2. Tutte le funzioni standard sulle stringhe in PHP usano per default la codifica Latin1 (quindi anche htmlspecialchars() e htmlentities()). Per forzarle ad usare UTF-8, devi passare loro il terzo argomento impostato su 'UTF-8'.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617
    Ho risolto, ho inserito una"magica istruzione" all'interno del foglio php:
    mysql_query('set names utf8');

    La scrivo per i posteri, grazie a tutti per l'aiuto!

  9. #9
    Infatti quella istruzione forza MySQL a usare UTF-8 nella connessione, mentre normalmente usa Latin1. Tuttavia non dovrebbe essere necessario usarla...di solito si usa appunto da console per forzare la codifica usata (che tra parentesi ha dei problemi...ho riscontrato che gli insert di stringhe con caratteri particolari non funzionano più da riga di comando e penso anche da form di pagine PHP), ma con lettura da pagine PHP non dovrebbe servire. Infatti te l'avevo scritto nella prima risposta a questa discussione.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617
    sisi, infatti ti ringrazio perchè leggendo it uoi consigli ho avuto una direzione da seguire per le mie ricerche, alla fine mi ero reso conto anche io che c'era qualche cosa che non andava in questa codifica e cercando cercando ho trovato questa istruzione, non mi avrai risolto definitivamente il problema ma mi hai senza dubbio indirizzato nella direzione giusta!
    Gracias!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.