Pregunta

Yo, como muchos otros desarrolladores de PHP han tenido problemas con la codificación de personajes, la pregunta describirá los pasos que paso para asegurar que mis datos se guarden y salgan como UTF8. Me gustaría cualquier consejo sobre qué más debo considerar o cambiar con mi pensamiento actual.

Tengo una base de datos MySQL DEFAULT CHARACTER UTF-8 mis tablas tienen una recopilación de utf8_general_ci

Estoy usando un script PHP para leer datos de un feed RSS y luego guardar esos datos por base de datos. Antes de guardar esos datos, verifico si esos datos son UTF-8 o no haciendo lo siguiente:

protected function _convertToUTF8($content) {
    $enc = mb_detect_encoding($content);
    return mb_convert_encoding($content, "UTF-8", $enc);
}

Al emitir estos datos a una página web, configuré los encabezados en PHP

header("Content-type: text/html; charset=utf-8");

y también configuré la metaetiqueta de tipo contenido para ser UTF-8

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Hasta ahora todo funciona, como se esperaba, no obtengo caracteres divertidos y todo va bien, pero ¿debería estar cambiando/considerando algo más al tratar con estos datos?

El problema que ahora tengo es generar estos datos a un archivo txt (CSV) que estoy usando fwrite () que ha creado con éxito el archivo, pero el tercero estoy aprobando este archivo para decir que el archivo no es UTF-8. No estoy seguro de que los datos se generen como UTF-8, ¿cómo puedo comprobar esto? Cuando se inicia sesión en el servidor remoto a través de SSH y yo gato el archivo que obtengo Itâs a Cuando vim el archivo que obtengo Itâ~@~Ys Cuando tengo menos el archivo que obtengo It<E2><80><99>s. ¿Que me estoy perdiendo aqui?

¡Gracias por adelantado!

¿Fue útil?

Solución 2

Al final, era una licuación que era necesaria para que la aplicación externa lea el archivo correctamente.

Otros consejos

No puede detectar la codificación de ningún dato. La codificación siempre es metainformación al lado de los datos en sí.

Incluso mb_detect_encoding() Intenta que sea mejor hacerlo, nunca debes usarlo para manejar los datos automáticamente. Porque como no es posible detectar la codificación de los datos en sí, esta función no puede tan bien.

No confíes en ello. Úselo solo para la inspección manual en caso de que necesite depurar un problema o en el último recurso de alojamiento, pero nunca en los procesos de datos estándar. Un incluso entonces, no confíes demasiado en esa información.

¿Cómo puedo decirlo? Solo un ejemplo: un texto puede estar codificado de US-ASCII válidamente y una rutina de detección para UTF-8 devolverá que está codificado por UTF-8 válido. Y ese es solo un ejemplo. La verdad es que esto es mucho más complejo.

Así que dé por sentado que no puede detectar la codificación de los datos sin procesar.

En su lugar, busque la meta información que especifique la codificación. Si no se proporciona información de codificación, busque la codificación predeterminada en los documentos de especificación para el transporte de datos.

En su caso de almacenar datos de Feeds RSS, busque la información en los encabezados de respuesta y/o el Prólogo XML. Normalmente contiene la codificación en la notación ISO del documento.

Como su base de datos espera datos codificados como UTF-8, su procesamiento debe tener cuidado de que solo los datos UTF-8 se pongan en la base de datos. Por lo tanto, verifique y adquiere la codificación de los datos y luego haga los pasos necesarios para cambiar la codificación. Pero no confíes en mb_detect_encoding() para realizar estos pasos.

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