without utf8 sublime convertir como bom archivos archivo php utf-8 character-encoding byte-order-mark

php - utf8 - utf-8 without bom sublime text



Firma UTF-8 BOM en archivos PHP (7)

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 alientan su uso 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, así que obviamente no es una buena idea guardar todos los archivos PHP con la lista de materiales al principio, pero eso no significa que no deba usar la lista de materiales en su respuesta

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

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

Para más información: https://www.w3.org/International/questions/qa-byte-order-mark#transcoding

Estaba escribiendo algunas clases comentadas de PHP 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é).

A pesar de que guardo el archivo como UTF-8, algunos amigos informaron que vieron al personaje 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 otras preguntas similares aquí sobre SO.

Sé que agrega algunas cosas al principio del archivo, y por lo que entendí, no es tan malo, pero me preocupa porque los únicos escenarios problemáticos que leí sobre los archivos PHP involucrados. 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, ¿debo usarlo sin preocuparme? ¿O hay casos en que podría causar daños? ¿Cuando?


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

Creo que el problema realmente es tu y la configuración del editor de tu amigo. Sin una lista de materiales, el editor de su amigo puede no reconocer automáticamente el archivo como UTF-8. Puede intentar configurar su editor de manera que el editor espere que un archivo esté en UTF-8 (si usa un IDE real como NetBeans, esto puede incluso ser 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 introducido. Podrías intentar iniciar cada archivo con

<?php //Úτƒ-8 encoded

Y tal vez la heurística lo consiga. Probablemente haya mejores cosas para colocar allí, y puede buscar en Google qué tipo de codificación de heurísticas de detección son comunes, o simplemente probar un poco :-)

Con todo, recomiendo simplemente corregir la configuración del editor.

Oh, espera, leo mal la última parte: para difundir el código a cualquier lugar, supongo que estás más seguro de que todos los archivos contengan solo los caracteres de 7 bits más bajos, es decir, ASCII simple, o simplemente para aceptar que algunas personas con editores antiguos ven tu nombre escrito gracioso No hay una manera segura. El BOM es definitivamente malo debido a los encabezados ya enviados. Por otro lado, siempre que solo pongas caracteres UTF-8 en los comentarios, el único impacto de un editor que malinterpreta la codificación son los caracteres extraños. Me gustaría escribir correctamente su nombre y agregar un comentario dirigido a heurísticas para que la mayoría de los editores lo entiendan, pero siempre habrá gente que verá caracteres falsos en su lugar.


En PHP, además del error "los encabezados ya enviados", la presencia de una lista de materiales también puede alterar el HTML en el navegador de manera más sutil.

Vea este link para un resumen del problema.

Cuando esto ocurre, no solo suele haber un espacio notable en la parte superior de la página renderizada, sino que si inspecciona el HTML en Firefox o Chrome, puede observar que la sección de la cabecera está vacía y que sus elementos parecen estar en el cuerpo. Por supuesto, ver la fuente mostrará todo donde debería estar, pero de alguna manera el navegador lo interpreta mal.


Esta es una publicación antigua y ya se me ha respondido, pero puedo dejarle algunos otros recursos que encontré cuando me enfrenté a este problema de la lista de materiales.

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 da la opción de guardar el archivo y no incluir las cosas de la lista de materiales

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


La lista de materiales causaría un error en los Headers already sent , por lo tanto, no puede usar la lista de materiales en archivos PHP


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


Para que sepa, hay una opción en php, zend.multibyte , que permite a php leer archivos con BOM sin dar un error a los Headers already sent .

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