Pregunta

Tengo un script php que accede a una base de datos MSSQL2005, lee algunos datos y envía los resultados por correo.

Hay caracteres especiales en los nombres de algunas columnas y en los campos en sí.

Cuando accedo a la secuencia de comandos a través de mi navegador (servidor web iis), la consulta se ejecuta correctamente y el contenido del correo está codificado correctamente (para mi audiencia). Sin embargo, cuando ejecuto php desde la consola, la consulta falla (debido a los caracteres especiales en los nombres de columna). Si reemplazo los caracteres especiales en la consulta con llamadas a chr () y el código de caracteres en latin-1, la consulta se ejecuta correctamente, pero los resultados también se codifican en latin-1 y, por lo tanto, no se muestran correctamente en el correo. ¿Por qué es PHP / el controlador MSSQL / & # 8230; utilizando una codificación diferente en los dos escenarios? ¿Hay alguna forma de evitarlo?

Si se pregunta, necesito la consola porque quiero programar el script usando SQLAgent (o taskmanager o lo que sea).

¿Fue útil?

Solución

Dependiendo del tipo de caracteres que tenga en su base de datos, podría ser una limitación de la consola, supongo. Si escribe chcp en la consola, verá cuál es la página de códigos activa, que podría ser algo así como CP437 también conocido como ASCII extendido. Si tiene caracteres fuera de esta página de códigos, como en UTF8, podría tener problemas. Puede cambiar la página de códigos activa actual escribiendo chcp 65001 para cambiar a UTF8.

También es posible que desee cambiar la fuente Raster predeterminada a Lucida Console dependiendo de los caracteres requeridos, ya que no todas las fuentes admiten caracteres extendidos (haga clic con el botón derecho en el título, las propiedades, la fuente de la ventana del símbolo del sistema).

Como ya se dijo, el soporte de Unicode de PHP no es ideal, pero puede hacerlo en PHP5 con algunas llamadas de función bien ubicadas de utf8_decode . El secreto de la codificación de caracteres es comprender bien cuál es la codificación actual de todas las herramientas que está utilizando: base de datos, conexión de base de datos, bytes actuales en su variable PHP, su salida a la pantalla de la consola, su correo electrónico codificación del cuerpo, su cliente de correo electrónico, etc.

Para todo lo que tiene caracteres especiales, en nuestros días modernos, a menudo se recomienda algo como UTF8. Asegúrese de que todo en el camino esté configurado en UTF8 y convierta solo cuando sea necesario.

Otros consejos

El pobre soporte de PHP para el mundo no inglés es bien conocido. Nunca he usado una base de datos con caracteres fuera del dominio ASCII básico, pero obviamente ya tienes una solución y parece que solo tienes que vivir con ella.

Si quisiera ir un paso más allá, podría: 1. Escriba una matriz que contenga todos los caracteres especiales y sus equivalentes CHR 2. foreach la matriz y str_replace en la consulta

Pero si la consulta está codificada, supongo que lo que tienes está bien. Además, asegúrese de estar utilizando la última versión de PHP, al menos 4.4.x, siempre hay un cambio que se solucionó, pero leí las notas de la versión 4.x.x y no veo nada relacionado con su problema.

Lo que hay que recordar acerca de las cadenas PHP es que son secuencias de bytes. Si desea obtener los datos en el conjunto de caracteres correcto (para lo que sea que esté haciendo), debe hacerlo explícitamente a través de algún tipo de función o filtro. Todo es bastante bajo nivel.

Dependiendo de su configuración, es posible que necesite conocer el conjunto de caracteres interno de las cadenas en la base de datos, pero al menos necesita saber qué conjunto de caracteres envía la base de datos a PHP (porque, recuerde, a PHP es solo una secuencia de bytes).

Entonces tienes que conocer el conjunto de caracteres de destino (y posiblemente especificarlo, lo que realmente deberías de todos modos). Por ejemplo, supongamos que obtiene utf-8 de la base de datos, pero desea enviar un latin-1 (y, por lo tanto, base64 o q-imprimible codificado como 'Content-transfer-encoding'):

$send_string = base64_encode(utf8_decode($database_string));

Por supuesto, en este caso, tendrías que saber que todos los caracteres utf-8 existen en el conjunto de caracteres latin-1, y probablemente no quieras realmente base64 (desafortunadamente PHP no tiene un buen q- función de codificación imprimible, aunque curiosamente, lo hace para decodificar), y si no está hablando de utf-8 < = > latin-1 querrás eliminar las funciones de mbstring en su lugar.

En cuanto a la consola, tendría que saber qué obtiene PHP cuando escribe caracteres especiales desde la consola, lo que probablemente depende de la configuración del shell y / o PHP. Pero recuerde que PHP solo entiende las cadenas como byte byte byte y debería poder resolverlo.

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