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
    754
    prova cos:

    Codice PHP:
    strpos(utf8_encode("Fbio"), 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("Fbio"), utf8_encode('b'));  = 5
    
    strpos("Fbio", 'b');                            = 3

  4. #4
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    754
    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
    63
    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 © 2019 vBulletin Solutions, Inc. All rights reserved.