Pregunta

Estaba escribiendo algunas clases de PHP comentadas y me encontré con un problema.Mi nombre (para la etiqueta @author) termina con un ș (que es un carácter UTF-8... y un nombre extraño, lo sé).

Aunque guardé el archivo como UTF-8, algunos amigos informaron que ven ese carácter totalmente desordenado (È™).Este problema desaparece al agregar la firma BOM.Pero eso me preocupa un poco, ya que no sé mucho al respecto, excepto por lo que vi en Wikipedia y en algunas otras preguntas similares aquí en SO.

Sé que agrega algunas cosas al principio del archivo y, por lo que entendí, no es tan malo, pero estoy preocupado porque los únicos escenarios problemáticos que leí involucraron archivos PHP.Y como estoy escribiendo clases de PHP para compartirlas, ser 100% compatible es más importante que tener mi nombre en los comentarios.

Pero estoy tratando de entender las implicaciones, ¿debería usarlo sin preocuparme?¿O hay casos en los que podría causar daños?¿Cuando?

¿Fue útil?

Solución

De hecho, la lista de materiales son datos reales enviados al navegador.El navegador lo ignorará felizmente, pero aún así no podrá enviar encabezados.

Creo que el problema realmente es la configuración del editor tuyo y de tu amigo.Sin una lista de materiales, es posible que el editor de su amigo no reconozca automáticamente el archivo como UTF-8.Puede intentar configurar su editor de modo que el editor espera un archivo en UTF-8 (si usa un IDE real como NetBeans, entonces esto puede incluso convertirse en una configuración de proyecto que puede transferir junto con el código).

Una alternativa es probar algunos trucos:algunos editores intentan determinar la codificación utilizando algunas heurísticas basadas en el texto ingresado.Podrías intentar comenzar cada archivo con

<?php //Úτƒ-8 encoded

y tal vez la heurística lo entienda.Probablemente haya mejores cosas para poner ahí, y puedes buscar en Google qué tipo de heurísticas de detección de codificación son comunes, o simplemente probar algunas :-)

Considerándolo todo, recomiendo simplemente arreglar la configuración del editor.

Oh espera, leí mal la última parte:Para difundir el código a cualquier lugar, supongo que lo más seguro es hacer que todos los archivos solo contengan caracteres inferiores de 7 bits, es decir,ASCII simple, o simplemente aceptar que algunas personas con editores antiguos vean su nombre escrito de manera extraña.No existe una forma a prueba de fallos.La lista de materiales definitivamente es mala debido a los encabezados ya enviados.Por otro lado, siempre que solo coloque caracteres UTF-8 en los comentarios, el único impacto de que algún editor malinterprete la codificación son caracteres extraños.Yo optaría por escribir correctamente su nombre y agregar un comentario dirigido a la heurística para que la mayoría de los editores lo entiendan, pero siempre habrá personas que verán caracteres falsos.

Otros consejos

Bom causaría Headers already sent Error, entonces, no puede usar BOM en archivos PHP

Esta es una publicación antigua y ya ha sido respondida, pero puedo dejarle algunos otros recursos que encontré cuando me enfrenté a este problema de nacidos.

http://people.w3.org/rishida/utils/bomtester/index.php Con esta página, puede verificar si un archivo específico contiene BOM.

También hay un script práctico que genera todos los archivos con BOM en su directorio actual.

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

Encontré ese código en php.net

Dreamweaver también ayuda con esto, le brinda la opción de guardar el archivo y no incluir las cosas de BOM

Es una respuesta tardía, pero todavía espero que ayude. Adiós

Para que lo sepas, hay una opción en PHP, zend.multibyte, que permite a PHP leer archivos con BOM sin dar el Headers already sent error.

Desde el archivo 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

O puede activar el almacenamiento en búfer de salida en php.ini que resolverá el problema "encabezados ya enviados". También es muy importante usar el almacenamiento en búfer de salida para el rendimiento si su sitio tiene una carga significativa.

En la primera línea, la variable $nyckellista se está declarando implícitamente como una matriz y luego está asignando a su primera posición una matriz de valores.

¿Es esto lo que necesitas / tiene la intención?

Editar:

Otro punto es, en el área de Cuenta del Código, que las matrices PHP obtienen índices numéricos que comienzan a 0, no en 1 (consulte el ejemplo # 4 en referencia de matriz PHP )

BOM es en realidad la forma más eficiente de identificar un archivo UTF-8, y tanto los navegadores modernos como los estándares admiten y fomentan el uso de TI en los cuerpos de respuesta HTTP.

En el caso de los archivos PHP, no es el archivo, sino la salida generada que se envía como respuesta, por lo que obviamente no es una buena idea guardar todos los archivos PHP con el BOM al principio, pero no significa que no deba usar el BOM en tu respuesta.

De hecho, puede inyectar el siguiente código de manera segura justo antes de su declaración de doctype (en caso de que esté generando HTML como respuesta):

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

Para leer más: https://www.w3.org/international/questions/qa-byte-order-mark#transcoding

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top