Domanda

Stavo scrivendo alcune lezioni PHP commentate e mi sono imbattuto in un problema. Il mio nome (per il tag @author) finisce con un ș (che è un personaggio UTF-8, ... e uno strano nome, lo so).

Anche se salvo il file come UTF-8, alcuni amici hanno riferito di vedere quel personaggio totalmente incasinato (È™). Questo problema scompare aggiungendo la firma del bom. Ma quella cosa mi disturba un po ', dal momento che non ne so molto, tranne da quello che ho visto su Wikipedia e su altre domande simili qui.

So che aggiunge alcune cose all'inizio del file e da quello che ho capito non è poi così male, ma sono preoccupato perché gli unici scenari problematici che ho letto sui file PHP hanno coinvolto. E dal momento che scrivo lezioni PHP per condividerle, essere compatibili al 100% è più importante che avere il mio nome nei commenti.

Ma sto cercando di capire le implicazioni, dovrei usarlo senza preoccuparmi? O ci sono casi in cui potrebbe causare danni? Quando?

È stato utile?

Soluzione

In questo caso specifico, save non prende alcun argomento.Questo è quello che succede con una splat nuda.Ma, poiché potresti essere consapevole, chiamare save su un modello ActiveRecord accetta le opzioni perché questo metodo viene sovrascritto da ActiveRecord::Validations qui:

https:// GitHub.Com / Rails / Rails / Blob / V3.1.3 / ActiveCord / Lib / Active_record / validations.rb # l47

# The validation process on save can be skipped by passing <tt>:validate => false</tt>. The regular Base#save method is
# replaced with this when the validations module is mixed in, which it is by default.
def save(options={})
  perform_validations(options) ? super : false
end
.

Altri suggerimenti

Bom avrebbe causato Headers already sent Errore, quindi non è possibile utilizzare BOM nei file PHP

Questo è un vecchio post e ho già ricevuto risposta, ma posso lasciarti alcune risorse che ho trovato quando ho affrontato questo problema.

http://people.w3.org/risida/utils/bomtester/index.php Con questa pagina è possibile verificare se un file specifico contiene BOM.

C'è anche uno script pratico che emette tutti i file con BOM nella directory corrente.

<?php 
function fopen_utf8 ($filename) { 
    $file = @fopen($filename, "r"); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") 
    { 
        return false; 
    } 
    else 
    { 
        return true; 
    } 
} 

function file_array($path, $exclude = ".|..|design", $recursive = true) { 
    $path = rtrim($path, "/") . "/"; 
    $folder_handle = opendir($path); 
    $exclude_array = explode("|", $exclude); 
    $result = array(); 
    while(false !== ($filename = readdir($folder_handle))) { 
        if(!in_array(strtolower($filename), $exclude_array)) { 
            if(is_dir($path . $filename . "/")) { 
                                // Need to include full "path" or it's an infinite loop 
                if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true); 
            } else { 
                if ( fopen_utf8($path . $filename) ) 
                { 
                    //$result[] = $filename; 
                    echo ($path . $filename . "<br>"); 
                } 
            } 
        } 
    } 
    return $result; 
} 

$files = file_array("."); 
?>

Ho trovato quel codice su php.net

Dreamweaver aiuta anche con questo, ti dà la possibilità di salvare il file e non includere le cose del bom

È una risposta tardiva, ma spero ancora che aiuti. Ciao

Solo per così dire, c'è un'opzione in PHP, zend.multibyte, che consente a PHP di leggere i file con BOM senza dare il Headers already sent errore.

Dal file php.ini:

; If enabled, scripts may be written in encodings that are incompatible with
; the scanner.  CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings.  To use this feature, mbstring extension must be enabled.
; Default: Off
;zend.multibyte = Off

Oppure è possibile attivare il buffering di output in php.ini che risolverà il problema "già inviato". È anche molto importante utilizzare il buffering di output per le prestazioni se il tuo sito ha un carico significativo.

Nella prima riga la variabile $nyckellista viene dichiarata implicitamente come array e quindi assegni alla sua prima posizione una serie di valori.

è questo ciò di cui hai bisogno / intendo?

Modifica:

Un altro punto è, nell'area conteggi del codice, che gli array PHP ottengono indici numerici a partire da 0, non a 1 (vedi esempio # 4 in Riferimento array php )

La BOM è in realtà il modo più efficiente per identificare un file UTF-8, ed sia i browser e gli standard moderni che supportano e incoraggiano l'uso di esso nei corpi di risposta HTTP.

In caso di file PHP non è il file ma l'output generato che viene inviato come risposta, quindi ovviamente non è una buona idea salvare tutti i file PHP con il BOM all'inizio, ma non significa che non dovresti usare il BOM Nella tua risposta.

In effetti puoi iniettare in modo sicuro il seguente codice proprio prima della dichiarazione Doctype (nel caso in cui tu stia generando HTML come risposta):

<?="\xEF\xBB\xBF"?>

Per ulteriori leggi: https://www.w3.org/international/questions/qa-byte-order-mark#transcoding

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top