rombo - Salida de PHP mostrando pequeños diamantes negros con un signo de interrogación
signos de interrogacion php (20)
Agregue esta función a sus variables utf8_encode ($ su variable);
Estoy escribiendo un programa php que extrae de una fuente de base de datos. Algunos de los varchar tienen citas que se muestran como diamantes negros con un signo de interrogación en ellos ( , CARÁCTER DE REEMPLAZO , supongo que del texto de Microsoft Word).
¿Cómo puedo usar php para quitar estos personajes?
Como se mencionó en las respuestas anteriores, está sucediendo porque el texto se ha escrito en la base de datos en la codificación iso-8859-1
o en cualquier otro formato.
Entonces solo necesita convertir los datos a utf8
antes de utf8
.
$text = “string from database”;
$text = utf8_encode($text);
echo $text;
Cuando extrae datos de cualquier lugar, debe usar funciones con el prefijo md_FUNC_NAME
.
Tenía el mismo problema que me ayudó.
O puede encontrar el código de este símbolo y usar regexp para eliminar estos símbolos.
Ejecuté el código de "detección de codificación" después de mi cambio de intercalación en phpmyadmin y ahora aparece como Latin_1.
pero aquí hay algo que encontré buscando una anomalía de datos diferente en mi aplicación y cómo lo arreglé:
Acabo de importar una tabla que tiene codificación mixta (con signos de interrogación de diamante en algunas líneas, y todos estaban en la misma columna) así que aquí está mi código de corrección. Utilicé el proceso utf8_decode que toma el marcador de posición indefinido y asigna un signo de interrogación simple en el lugar del "signo de interrogación de diamante", luego utilicé str_replace para reemplazar el signo de interrogación con un espacio entre comillas. aquí está el [código]
include ''dbconnectfile.php'';
//// the variable $db comes from my db connect file
/// inx is my auto increment column
/// broke_column is the column I need to fix
$qwy = "select inx,broke_column from Table ";
$res = $db->query($qwy);
while ($data = $res->fetch_row()) {
for ($m=0; $m<$res->field_count; $m++) {
if ($m==0){
$id=0;
$id=$data[$m];
echo $id;
}else if ($m==1){
$fix=0;
$fix=$data[$m];
$fix = utf8_decode($fix);
$fixx =str_replace("?"," ",$fix);
echo $fixx;
////I echoed the data to the screen because I like to see something as I execute it :)
}
}
$insert= "UPDATE Table SET broke_column=''".$fixx."'' where inx=''".$id."''";
$insresult= $db->query($insert);
echo"<br>";
}
?>
Elegí sacar a estos personajes de la cuerda haciendo esto:
ini_set(''mbstring.substitute_character'', "none");
$text= mb_convert_encoding($text, ''UTF-8'', ''UTF-8'');
Eso puede ser causado por unicode u otro desajuste de juego de caracteres. Intente cambiar el juego de caracteres en su navegador, en la configuración el texto se verá bien. Luego, se trata de cómo convertir los contenidos de su base de datos en juego de caracteres que utiliza para mostrar. (Que en realidad puede ser solo agregar una declaración de conjunto de caracteres utf-8 a su salida).
Este es un problema de juego de caracteres. Como tal, puede haber salido mal en muchos niveles diferentes, pero lo más probable es que las cadenas en su base de datos estén codificadas en utf-8, y usted las presente como iso-8859-1. O al revés.
La forma correcta de solucionar este problema es hacer que tus juegos de caracteres sean directos. La estrategia más simple, ya que está usando PHP, es usar iso-8859-1 en toda su aplicación. Para hacer esto, debes asegurarte de que:
- Todos los archivos fuente de PHP se guardan como iso-8859-1 (No se debe confundir con cp-1252).
- Su servidor web está configurado para servir archivos con
charset=iso-8859-1
- Alternativamente, puede anular la configuración de los servidores web desde el documento PHP, utilizando el
header
. - Además, puede insertar una metaetiqueta en su HTML, que especifique lo mismo, pero esto no es estrictamente necesario.
- También puede especificar el atributo
accept-charset
en sus elementos<form>
. - Las tablas de la base de datos se definen con codificación como latin1
- La conexión de la base de datos entre PHP y la base de datos está establecida en latin1
Si ya tiene datos en su base de datos, debe tener en cuenta que probablemente ya estén en mal estado. Si aún no está en fase de producción, simplemente límpielo y vuelva a comenzar. De lo contrario, tendrás que hacer algo de limpieza de datos.
Una nota sobre las metaetiquetas, ya que todos malinterpretan lo que son:
Cuando un servidor web sirve un archivo (un documento HTML), envía cierta información, que no se presenta directamente en el navegador. Esto se conoce como encabezados HTTP. Uno de esos encabezados es el encabezado Content-Type
, que especifica el tipo mimet del archivo (por ejemplo, text/html
) y la codificación (aka charset). Si bien la mayoría de los servidores web enviarán un encabezado Content-Type
con información de charset
, es opcional. Si no está presente, el navegador interpretará las metaetiquetas con http-equiv="Content-Type"
. Es importante darse cuenta de que la metaetiqueta solo se interpreta si el servidor web no envía el encabezado. En la práctica, esto significa que solo se usa si la página se guarda en el disco y luego se abre desde allí.
Esta página tiene una muy buena explicación de estas cosas.
Esto pasó a funcionar en mi caso:
$text = utf8_decode($text)
Convierto el personaje de diamante negro en un signo de interrogación para que puedas:
$text = str_replace(''?'', '''', utf8_decode($text));
Esto te ayudara. Pon esto dentro de la etiqueta <head>
<meta charset="iso-8859-1">
Lo que terminé haciendo al final después de que arreglé mis tablas fue hacer una copia de seguridad y cambiar la configuración a utf-8, luego modifiqué mi archivo de volcado para que DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci sean mis entradas de conjunto de caracteres
ahora ya no tengo problemas con el juego de caracteres porque la base de datos y el navegador son utf8.
Descubrí qué lo causó. Era la página web + los efectos del navegador en la base de datos. En los terminales que son linux (ubuntu + firefox) estaba codificando la base de datos en latin1, que es lo que configuran las tabulaciones. Pero en las terminales 10 + edge de Windows, las entradas se codificaron a la fuerza en utf8. También noté que Windows 10 tiene problemas para permanecer con latin1, así que decidí inclinarme con el viento y convertir todo a utf8.
Pensé que era un problema de Windows 10 porque comenzamos a usar los terminales de Win 10. así que una vez más, los errores de Microsoft causan problemas. Todavía no sé por qué la codificación cambia en los formularios porque el navegador de Windows 10 muestra el conjunto de caracteres latin1, pero cuando está codificado en utf8 aparece la anomalía de los datos. pero en linux + firefox no hace eso.
Para asegurarse de que su conexión MYSQL esté configurada en UTF-8 (o latin1, dependiendo de lo que esté usando), puede hacer esto para:
$con = mysql_connect("localhost","username","password");
mysql_set_charset(''utf8'',$con);
o use esto para verificar qué juego de caracteres está usando:
$con = mysql_connect("localhost","username","password");
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset/n";
Más información aquí: http://php.net/manual/en/function.mysql-set-charset.php
Para propósitos globales.
En lugar de convertir, codificar, descodificar cada texto, prefiero dejarlos tal como están y, en su lugar, cambiar la configuración de php del servidor. Asi que,
- Deje que los diamantes
- Desde el navegador, en el menú de visualización, seleccione "codificación de texto" y busque la que le permita ver su texto correctamente.
Edite su php.ini y agregue:
default_charset = "ISO-8859-1"
o en lugar de ISO-8859, el que se ajusta a su codificación de texto.
Prueba esto por favor
mb_substr ($ description, 0, 490, "UTF-8");
Según su descripción del problema, los datos en su base de datos casi con toda seguridad están codificados como Windows-1252 , y su página casi con certeza se sirve como ISO-8859-1 . Estos dos conjuntos de caracteres son equivalentes, excepto que Windows-1252 tiene 16 caracteres adicionales que no están presentes en ISO-8859-1, incluidas las comillas tipogrillas izquierda y derecha.
Suponiendo que mi análisis es correcto, la solución más simple es servir a su página como Windows-1252. Esto funcionará porque todos los caracteres que están en ISO-8859-1 también están en Windows-1252. En PHP puedes cambiar la codificación de la siguiente manera:
header(''Content-Type: text/html; charset=Windows-1252'');
Sin embargo, realmente debe verificar qué codificación de caracteres está utilizando en sus archivos HTML y el contenido de su base de datos, y tener cuidado de ser coherente o convertir correctamente cuando esto no sea posible.
Si ve ese carácter ( U + FFFD "CARACTER DE REEMPLAZO"), generalmente significa que el texto en sí está codificado en alguna forma de codificación de un solo byte pero interpretado en una de las codificaciones Unicode (UTF8 o UTF16).
Si fuera al revés, (generalmente) se vería algo como esto: ä.
Probablemente la codificación original sea ISO-8859-1, también conocida como Latin-1. Puede verificar esto sin tener que cambiar su secuencia de comandos: los navegadores le dan la opción de volver a interpretar una página con una codificación diferente; en Firefox use "Ver" -> "Codificación de caracteres".
Para hacer que el navegador use la codificación correcta, agregue un encabezado HTTP como este:
header("Content-Type: text/html; charset=ISO-8859-1");
o pon la codificación en una metaetiqueta:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Alternativamente, podría tratar de leer desde la base de datos en otra codificación (UTF-8, preferiblemente) o convertir el texto con iconv()
.
Simplemente agregue estas líneas antes de los encabezados.
Se recuperará el formato exacto de los archivos .doc/docx
:
if(ini_get(''zlib.output_compression''))
ini_set(''zlib.output_compression'', ''Off'');
ob_clean();
También me enfrenté a este problema. Mientras tanto, me encontré con tres casos donde sucedió:
substr ()
Estaba usando
substr()
en una cadena UTF8 que cortaba caracteres UTF8, por lo que los caracteres cortados no se podían mostrar correctamente. Usemb_substr($utfstring, 0, 10, ''utf-8'');
en lugar. Creditshtmlspecialchars ()
Otro problema fue el uso de
htmlspecialchars()
en una cadena UTF8. La solución es usar:htmlspecialchars($utfstring, ENT_QUOTES, ''UTF-8'');
preg_replace ()
Por último, descubrí que
preg_replace()
puede provocar problemas con UTF. El código$string = preg_replace(''/[^A-Za-z0-9ÄäÜüÖöß]/'', '' '', $string);
por ejemplo, transformó la cadena UTF "F (×) = 2 × -3" en "F 2 ". La solución es usarmb_ereg_replace()
lugar.
Espero que esta información adicional ayude a deshacerse de tales problemas.
También puede cambiar el conjunto de caracteres en su navegador. Solo por razones de depuración.
Usar el mismo juego de caracteres (como se sugiere aquí) tanto en la base de datos como en el HTML no me ha funcionado ... Entonces, al recordar que el código se generó como HTML, elegí usar el "
(Código HTML) o el "
(Código ISO Latin-1) en el texto de mi base de datos donde se usaron las comillas. Esto resolvió el problema al proporcionarme una comilla. Es extraño observar que, antes de esta solución, solo algunas de las comillas y apóstrofes no se mostraban correctamente, mientras que otras sí, sin embargo, el código especial sí funcionaba en todas las instancias.
Vaya a su phpmyadmin y seleccione su base de datos y simplemente aumente la longitud / valor del campo de esa tabla a 500 o 1000, esto resolverá su problema.