Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    strpos() con lettere accentate

    Buongiorno
    ho ripreso un vecchio sito per convertirlo da PHP5 a PHP7 e poterlo registrare con protocollo https.
    Migrazione abbastanza indolore per mysql --> mysqli ma è rimasto un problema che non riesco a risolvere.
    La strpos() eseguita su una stringa contenente lettere accentate da come risposta valori diversi da quelli che ottenevo con PHP5.
    Per essere più preciso la ricerca di un carattere (usavo charset=ISO-8859-1) dava come risultato la posizione del carattere trovato nella stringa (-1).
    Adesso uso la codifica utf-8 (le altre visualizzano strani simboli) ma l'impressione è che le lettere accentate occupino 2 caratteri e le posizioni trovate vengono sfalsate e non coincidono.
    E' da tempo che non seguo il sito e l'evoluzioni del PHP, sicuramente qualcosa è cambiato e nuove istruzioni/dichiarazioni sono state aggiunte.
    Continuo a cercare, graditi eventuali suggerimenti.
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    765
    prova così:

    Codice PHP:
    strpos(utf8_encode("Fábio"), utf8_encode('á')); 
    eXvision

  3. #3
    Ciao ti ringrazio tantissimo ma il problema rimane.
    cercando la 'à' come hai suggerito ottengo giustamente 1 sia con le tue aggiunte che senza.
    Il problema è se cerco la 'b', quindi nella stringa scavalca la lettera accentata, ottengo 3 senza le tue aggiunte e 5 con.
    Mi viene da pensare che se scrivessi "F àb i o " e dividessi il risultato per due risolverei il problema.
    Forse è meglio risolvere in modo più serio.

    codice:
    strpos(utf8_encode("Fábio"), utf8_encode('b'));  = 5
    
    strpos("Fábio", 'b');                            = 3

  4. #4
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    765
    usa le funzioni multibyte safe: mb_strpos
    https://www.php.net/manual/en/function.mb-strpos.php
    eXvision

  5. #5
    Grazie ad entrambi con il suggerimento di brodik e qualche arrangiamento ho risolto.

    Ma rimane qualche dubbio...
    Da quel poco che sono riuscito a capire è che in PHP5 (codifica ISO-8859-1) in una stringa il numero di caratteri coincideva con la sua lunghezza con o senza lettere accentate.

    In utf-8 sembra non essere così, "aèìòù" è lunga 10 caratteri.
    Domanda:
    Una stringa con lettere accentate rischia di essere troncata se memorizzata in un campo MySql lungo 5 con codifica latin_swedish_ci?

    Il piccolo arrangiamento è che oltre a sostituire la "strpos con mb_strpos" ho dovuto sostituire anche la strlen, str_substr con le rispettive mb_strlen e mb_strsubstr, il problema è che sto convertendo un sito di una certa dimensione.
    Domanda:
    Conviene a questo punto sostituire, senza pensarci troppo, tutte le istruzioni stringa con le corrispondenti mb_istruzioni stringa?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    86
    Il problema è il supporto penoso di PHP con le stringhe multibyte. È stato in parte risolto con l'introduzione della libreria mbstring.

    A differenza dei caratteri "normali", PHP memorizza i caratteri multibyte (ad es. lettere accentate) con due byte, per questo motivo dovresti sempre utilizzare la controparte mb_* delle funzioni per gestire stringhe.

    Dai un'occhiata a questa guida, nell'esempio della funzione strlen() https://guidaphp.it/base/funzioni/stringhe

    A livello di database devi fare la stessa cosa, ossia cambiare la codifica in utf8mb4 (dimenticati di latin_swedish) che ormai è diventato lo standard per gestire caratteri Unicode.

    Ricordati che la connessione al DB deve avvenire anch'essa in utf8, altrimenti i dati contenenti caratteri speciali non verranno salvati/prelevati correttamente.

    E anche nell'HTML dovrai utilizzare il metatag charset

    codice HTML:
    <meta charset="utf-8">

    Riassumento devi gestire la codifica dei caratteri ad ogni livello:


    • PHP
    • Database
    • HTML

  7. #7
    Grazie Flaviors200 per l'esauriente risposta...
    credevo che la migrazione mysql-->mysqli fosse la parte più impegnativa e invece ho avuto la sorpresa dell'strpos() che dava risultati sfalsati.
    Per la migrazione PHP5-->PHP7 uso un diverso approccio, ho la necessità che il sito sia convertito e funzionante nel più breve tempo possibile, credo (e spero) che sviluppare un traduttore tra le due versioni di php sia il modo più veloce e sicuro.
    Adesso implemento la sostituzione delle istruzioni_stringa nelle corrispondenti mb_istruzioni_stringa sperando di non avere altre sorprese.
    Ho visto che anche phpMailer non funziona più.

Tag per questa discussione

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.