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

    Conversione file da ISO-8859-1 a UTF-8

    Ho un piccolo problema che mi sta facendo uscire matto, devo convertire completamente un sito da ISO-8859-1 a UTF-8 ma qualsiasi metodo usi, dall'aprire il file e salvarlo con nome con altra codifica, sia con Notepad che con Scite, sia creando uno script di conversione byte a byte in C#, il risultato è sempre lo stesso, i file generati contengono, presumo all'inizio, una sorta di carattere NULL.

    Es., un file che include altri file a catena, per un totale di 4 file compreso l'inclusore, mi dovrebbe generare la stringa "OK", così effettivamente sembra, ma in realtà se misuro la length del prodotto è di 6 caratteri dove OK è il 5° e 6° carattere.

    Provando a convertire l'inclusore nuovamente in ISO la stringa passa da lunghezza 6 a 5, quindi è evidente il problema.

    Il guaio più grosso è relativo soprattutto al session_start() che deve partire prima di ogni output. Purtroppo qualsiasi pagina provo ad eseguire che sia stata convertita o anche creata ex novo in UTF-8 prima del session_start() genera sempre il malefico carattere null di output che fa andare in palla il session_start() e che quindi non parte.

    Avete avuto anche voi questo problema?

  2. #2
    Allora, non ci credevo ma alla fine ho raggiunto un ulteriore nuovo livello di conoscenza sulla codifica charset, i charset non smetteranno mai di stupirmi, quando pensi di aver capito tutto c'è sempre qualcosa che ignori.

    Allora, per prima cosa ho trovato che i file UTF-8 veri, es. se apro un file di testo con Scite, cambio l'encoding (File -> Encoding) in UTF-8, modifico qualcosa e salvo, sono uno sputacchio più grandi rispetto al corrispettivo ANSI a 8 bit.
    Questo è dovuto al BOM (byte of mark se non sbaglio) che indica a qualsiasi applicativo che il file in questione è un UTF-8 e così viene aperto, interpretato e lavorato.
    Piccolo inconveniente, il BOM si trova all'inizio del file e quando utilizzo un file UTF-8 con BOM in PHP questo genera sempre un output finto prima di ogni cosa, praticamente stampa il BOM, che è sostanzialmente invisibile, ma c'è e manda in palla il session_start() che deve essere eseguito prima di ogni output.

    La soluzione è utilizzare file UTF-8 senza BOM, per ottenerli e per fare una prova ho usato questo script C# (data una cartella converte tutti i file presenti in questa e nelle sotto cartelle da ANSI a UTF-8 senza BOM)
    codice:
            static void Main(string[] args)
            {
                leggi(args[0]);
            }
    
            static void leggi(string cartella)
            {
                if (Directory.Exists(cartella))
                {
                    DirectoryInfo di = new DirectoryInfo(cartella);
                    foreach (DirectoryInfo di2 in di.GetDirectories())
                        leggi(di2.FullName);
                    foreach (FileInfo fi in di.GetFiles())
                        Riscrivi(fi.FullName);
                }
            }
    
            static void Riscrivi(string file)
            {
                UTF8Encoding utf8WithoutBom = new System.Text.UTF8Encoding(false);
                StreamReader sr = new StreamReader(file, System.Text.Encoding.GetEncoding("iso-8859-1"));
                StreamWriter sw = new StreamWriter(file + "_tmp", false, utf8WithoutBom);
                while (!sr.EndOfStream)
                {
                    Encoding utf_8 = Encoding.UTF8;
                    byte[] bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(sr.ReadLine());
                    string s = utf_8.GetString(bytes);
                    sw.WriteLine(s);
                }
                sr.Close();
                sw.Close();
                File.Delete(file);
                File.Move(file + "_tmp", file);
            }
    La cosa curiosa è che aprendo un file generato in questo modo con Scite mi viene visto come File -> Encoding -> 8 bit, ovvero come un normalissimo ANSI!!

    In sostanzo ho fatto tutto questo giro di parole per dire che... il sito anche se è UTF-8 i file php, js, html, css e quant'altro devono comunque essere tutti ANSI!

    Però c'è, almeno con Scite ed editor simili, il problema d'interpretazione del testo visualizzato, se apro il file con doppio click lo vede come 8 bit, se scrivo in esso in cirillico non ci riesce, si vedono tutti ?????, se salvo anche sul browser si vede male. In sostanza, solo se il file contiene effettivamente caratteri strani come il cirillico, almeno con Scite bisogna aprire il file, modificare l'Encoding a mano in UTF-8, lavorare sul file e infine prima del salvataggio finale rimettere l'encoding a 8 bit (vedrete tutto il testo strano che diventerà ancora più strano) e salvare.
    Anche se su Scite si vedrà male sul browser si vedrà bene.

    Conducendo delle ricerche ho capito che esistono IDE con i quali si può imporre l'utilizzo di UTF-8 senza BOM per un sito e che quindi sono in grado di visualizzare correttamente il contenuto dei file continuando a salvarli correttamente, quali IDE siano non lo so, non ho approfondito ma ci sono.

    Oltre al discorso dei file, che è comunque molto importante, vanno fatte anche delle operazioni a livello di HTML, PHP e Database:

    1° nell'HEAD html mettere
    codice:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2° nel PHP va imposto l'header UTF-8
    Codice PHP:
    header('Content-Type: text/html; charset=utf-8'); 
    3° Se si usa MySql il database e le tabelle devono essere utf8_general_ci

    4° Sempre se si usa MySql quando si apre la connessione al DB appena aperta la connessione va imposta la direttiva di utilizzo UTF-8, con una query non select "SET NAMES UTF8".

    5° Accantonate le conversioni in htmlentities su PHP o gli escape javascript (se usate ajax), se i file sono salvati bene e le regole precedenti sono state eseguite alla lettera il vostro sito prenderà e visualizzerà pure il giapponese senza problemi di sorta

    Seguendo queste regole e salvando i file a 8 bit almeno per il momento non ho avuto più problemi di sorta nel visualizzare e modificare nel db carattari particolari (es. °) e stranieri (es. cirillico).

    Saluti a tutti!

  3. #3
    Altra piccola aggiunta, l'ide che ho sperimentato per primo è stato Eclipse con PDT, la prospettiva PHP, si trova già pronto all'uso.
    Con questo, una volta creato un progetto php, andare su proprietà del progetto -> Resource -> Text file encoding -> Other: e mettere UTF-8

    Da adesso vedrete e lavorerete sui vostri file in utf-8 ma saranno salvati come 8 bit quindi senza il BOM.

    Unico appunto, scaricate la versione a 32 bit di Eclipse con PDT, anche se avete Windows a 64 bit, ed installate Java Runtime (JRE) a 32 bit, purtroppo Eclipse con PHP a 64 bit (Helios) che usa Jre 64bit è dannatamente instabile, in 3 ore di lavoro mi si è impallato 7-8 volte.

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.