utf8 - fwrite php ejemplo
fwrite() y UTF8 (6)
El problema es que tus datos tienen doble codificación. Supongo que su texto original es algo así como:
Don’t do anything
con ''
, es decir, no el apóstrofo directo, sino la comilla simple correcta.
Si escribe un script PHP con este contenido y está codificado en UTF-8:
<?php
//File in UTF-8
echo utf8_encode("Don’t"); //this will double encode
Obtendrás algo similar a tu resultado.
Estoy creando un archivo usando php fwrite () y sé que todos mis datos están en UTF8 (he realizado pruebas exhaustivas sobre esto: al guardar los datos en db y generar en una página web normal todos funcionan bien y se informan como utf8.), Pero me dicen que el archivo que estoy enviando contiene datos que no son utf8 :( ¿Hay un comando en bash (CentOS) para verificar el formato de un archivo?
Al usar vim, muestra el contenido como:
Donâ ~ @ ~ Yt haz cualquier cosa ... Itâ ~ @ ~ Ys un gran sitio con todo .... Weâ ~ @ ~ Yve acaba de lanzar /
Se agradecería cualquier ayuda: confirmando que el archivo es UTF8 o cómo escribir contenido utf8 en un archivo.
ACTUALIZAR
Para aclarar cómo sé que tengo datos en UTF8, he hecho lo siguiente:
- DB se establece en utf8 Al guardar datos
a la base de datos que ejecuto esto primero:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "UTF-8", $enc);
Justo antes de ejecutar fwrite, he comprobado los datos con Note, cada dato devuelve ''IS utf-8''
if (strlen($data)==mb_strlen($data, ''UTF-8'')) print ''NOT UTF-8''; else print ''IS utf-8'';
¡Gracias!
I know all my data is in UTF8
- mal.
La codificación no es el formato de un archivo. Por lo tanto, compruebe el juego de caracteres en los encabezados de la página, donde toma datos de:
header("Content-type: text/html; charset=utf-8;");
Y comprueba si los datos realmente están codificados en varios bytes:
if (strlen($data)==mb_strlen($data, ''UTF-8'')) print ''not UTF-8'';
else print ''utf-8'';
Lo único que tuve que hacer fue agregar un BOM UTF8 al CSV, los datos eran correctos pero el lector de archivos (aplicación externa) no podía leer el archivo correctamente sin el BOM
Si sabe que los datos están en UTF8, no quiere configurar el encabezado.
Escribí una solución respondiendo a otra huella.
La solución es la siguiente: Como la marca de orden de bytes UTF-8 es /xef/xbb/xbf
, debemos agregarla al encabezado del documento.
<?php
function writeStringToFile($file, $string){
$f=fopen($file, "wb");
$file="/xEF/xBB/xBF".$file; // this is what makes the magic
fputs($f, $string);
fclose($f);
}
?>
Puedes adaptarlo a tu código, básicamente solo quieres asegurarte de que escribes un archivo UTF8 (como dijiste que sabes que tu contenido está codificado en UTF8).
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
fwrite()
no es binario seguro. Eso significa que sus datos, ya sea que estén codificados correctamente o no, podrían desgarrarse por este comando o sus rutinas subyacentes.
Para estar seguro, debe usar fopen()
con el indicador de modo binario. eso es b
. Después, fwrite()
protegerá sus datos de cadena "tal como están", y eso es en PHP hasta ahora, datos binarios, porque las cadenas en PHP son cadenas binarias.
Antecedentes: algunos sistemas difieren entre texto y datos binarios. La bandera binaria explícitamente ordenará PHP en tales sistemas para usar la salida binaria. Cuando trabaje con UTF-8, debe tener cuidado de que los datos no se administren. Eso se evita manejando los datos de cadena como datos binarios.
Sin embargo: si no es como usted dijo en su pregunta que la codificación UTF-8 de los datos se conserva, entonces su codificación se rompió e incluso el manejo seguro binario mantendrá el estado roto. Sin embargo, con el indicador binario, aún se asegura de que esta no sea la parte fwrite()
de su aplicación que está rompiendo cosas.
Se ha escrito correctamente en otra respuesta aquí, que no conoce la codificación si solo tiene datos. Sin embargo, puede validar los datos si valida la codificación UTF-8 o no, lo que le brinda al menos alguna oportunidad de verificar la codificación. Una función en PHP que hace esto, la publiqué en una pregunta relacionada con UTF-8, por lo que podría ser útil para usted si necesita depurar cosas: Respuesta a: SimpleXML y chino busque can_be_valid_utf8_statemachine , ese es el nombre de la función.