web-dev-qa-db-fra.com

UTF-8 BOM Signature In PHP Fichiers

J'écris quelques commentés PHP classes et je suis tombé sur un problème. Mon nom (pour la balise @Author) finit par un ș (qui est un caractère UTF-8, ... et un nom étrange, je sais).

Même si je sauvegardais le fichier comme UTF-8, certains amis ont déclaré avoir vu ce personnage totalement foiré (È™). Ce problème disparaît en ajoutant la signature de la chômage. Mais cette chose me trouble un peu, car je ne sais pas cela beaucoup à ce sujet, sauf de ce que j'ai vu sur Wikipedia et sur d'autres questions similaires ici.

Je sais que cela ajoute des choses au début du dossier et, d'après ce que j'ai compris, ce n'est pas si grave, mais je suis inquiet parce que les seuls scénarios problématiques que j'ai lus à propos de Impliqué PHP fichiers. Et depuis que j'écris PHP classes pour les partager, être compatible à 100% est plus important que d'avoir mon nom dans les commentaires.

Mais j'essaie de comprendre les implications, devrais-je l'utiliser sans vous inquiéter? Ou y a-t-il des cas quand cela pourrait causer des dommages? Lorsque?

23
treznik

En effet, la nomenclature est des données réelles envoyées au navigateur. Le navigateur va heureusement l'ignorer, mais vous ne pouvez toujours pas envoyer d'en-têtes alors.

Je crois que le problème est vraiment vos paramètres d'éditeur de votre ami. Sans désordre, l'éditeur de votre ami peut ne pas reconnaître automatiquement le fichier comme UTF-8. Il peut essayer de configurer son éditeur de sorte que l'éditeur attend Un fichier dans UTF-8 (si vous utilisez un real IDE tel que NetBeans, puis cette Peut même être fait un paramètre de projet que vous pouvez transférer avec le code).

Une alternative consiste à essayer quelques astuces: certains éditeurs tentent de déterminer le codage en utilisant certaines heuristiques en fonction du texte entré. Vous pouvez essayer de démarrer chaque fichier avec

<?php //Úτƒ-8 encoded

et peut-être que l'heuristique l'obtiendra. Il y a probablement de meilleures choses à mettre là-bas et vous pouvez soit Google pour quel type de codage de détection de heuristique sont courants, soit juste en train d'essayer certains :-)

Dans l'ensemble, je recommande de définir simplement les paramètres de l'éditeur.

Oh attend, j'ai mal interprété la dernière partie: pour la diffusion du code à n'importe où, je suppose que vous êtes le plus sûr que tous les fichiers ne contiennent que tous les caractères de 7 bits inférieurs, c'est-à-dire la nature ASCII, ou simplement accepter que certaines personnes avec des éditeurs anciens voient Votre nom écrit drôle. Il n'y a pas de moyen sans échec. La naissance est définitivement mauvaise à cause des en-têtes déjà envoyés. De l'autre côté, tant que vous ne mettez que des caractères UTF-8 dans des commentaires, le seul impact d'un éditeur de l'éditeur mal compris que le codage est étrange. J'irais bien orthographier votre nom et ajouter un commentaire ciblé à l'heuristique afin que la plupart des éditeurs l'obtiennent, mais il y aura toujours des gens qui verront de faux caractères.

25
skrebbel

Bom causerait Headers already sent erreur, donc, vous ne pouvez pas utiliser bom in PHP fichiers

14

C'est un ancien poste et j'ai déjà répondu, mais je peux vous laisser d'autres ressources que j'ai trouvées lorsque je suis confronté à ce problème de la naissance.

http://people.w3.org/rishida/utils/bomtester/index.php avec cette page, vous pouvez vérifier si un fichier spécifique contient la nomenclature.

Il existe également un script pratique qui génère tous les fichiers avec BOM sur votre répertoire actuel.

<?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("."); 
?>

J'ai trouvé ce code sur php.net

Dreamweaver aide également à cela, cela vous donne la possibilité de sauvegarder le fichier et de ne pas inclure la bomique

C'est une réponse tardive, mais j'espère toujours que cela aide. Au revoir

9
omabena

Juste pour que vous sachiez, il y a une option dans PHP, zend.multibyte, qui permet à PHP de lire des fichiers avec une nomenclature sans donner le Headers already sent Erreur.

Du fichier 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
7
solarc

En plus des erreurs "en-têtes déjà envoyées", en plus des "en-têtes déjà envoyées", la présence d'une nomenclature peut également bousiller le HTML dans le navigateur de manière plus subtile.

Voir ceci Link pour un aperçu du problème.

Lorsque cela se produit, non seulement existe-t-il généralement un espace notable en haut de la page rendue, mais si vous inspectez le HTML dans Firefox ou Chrome, vous remarquerez que la section de la tête est vide et que ses éléments semblent être dans le corps. Bien sûr, la source de visualisation montrera tout ce qui devrait être, mais le navigateur l'interpréte de manière erronée.

2
matthewv789

Ou vous pouvez activer la mise en mémoire tampon de sortie dans PHP.INI qui résoudra les "en-têtes déjà envoyés". Il est également très important d'utiliser la mise en mémoire tampon de sortie des performances si votre site a une charge importante.

2
peufeu

BOM est en fait le moyen le plus efficace d'identifier un fichier UTF-8, ainsi que des navigateurs et des normes modernes et encouragent l'utilisation de celui-ci dans des organismes de réponse HTTP.

En cas de PHP Fichiers, ce n'est pas le fichier, mais la sortie générée qui est envoyée en tant que réponse si évidemment, ce n'est pas une bonne idée de sauvegarder tous PHP fichiers avec le BOM au début, mais cela ne signifie pas que vous ne devriez pas utiliser la nomenclature dans votre réponse.

En fait, vous pouvez également injecter le code suivant avant votre déclaration de DOCTYPE (au cas où vous générerez HTML comme réponse):

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

Pour une lecture supplémentaire: https://www.w3.org/international/Questions/qa-byteordoordage#TRANSCODING

1
Szabolcs Páll