Pregunta

Tengo una tabla de base de datos MySQL para almacenar el nombre del país y el símbolo de moneda: el charset se ha establecido correctamente en UTF8.

Estos son datos de ejemplo insertados en la tabla

insert into country ( country_name, currency_name, currency_code, currency_symbol) values 
('UK','Pounds','GBP','£');

Cuando miro en la base de datos, el símbolo de libra aparece bien, pero cuando lo recupero de la base de datos y la muestro en el sitio web, un símbolo cuadrado extraño aparece con un signo de interrogación en el interior en lugar del símbolo de libra.

Editar en my.cnf: el conjunto de caracteres se configuró en Latin1 - lo cambié a UTF8 - Luego inicié sesión como root y corrí s - regresó

Server characterset:    utf8
Client characterset:    utf8

Colgación

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'swipe_prod';

THIS DOES NOT RETURN ANYTHING

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

THIS RETURNS utf8_general_ci

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

THIS RETURNS 7 ROWS but all have either null or utf8_general_ci

Código PHP

<?php
$con = mysql_connect("localhost","user","123456");
mysql_select_db("swipe_db", $con);
$result = mysql_query("SELECT * FROM country where country_name='UK'");
while($row = mysql_fetch_array($result))
{
  echo $row['country_name'] . " " . $row['currency_symbol'];
}
mysql_close($con);
?>

Por favor consejo gracias

¿Fue útil?

Solución

Cuando ves ese "símbolo cuadrado extraño con un signo de interrogación dentro", también conocido como el Personaje de reemplazo, eso suele ser un indicador de que tiene un byte en el rango de 80-FF (128-255) y el sistema está tratando de representarlo en UTF-8.

Ese rango de bytes completo no es válido para los caracteres de un solo byte en UTF-8, pero todos son muy comunes en codificaciones occidentales como ISO-8859-1.

Cuando veo su página y cambio manualmente el personaje que codifica de UTF-8 a ISO-8859-1 (en Firefox con View >> Character Encoding >> Western (ISO-8859-1)) entonces el SIGNO DE LIBRA se muestra correctamente.

Entonces, ¿qué pasa entonces? Es difícil de decir: hay docenas de lugares donde esto se puede ensuciar. Pero lo más probable es que esté a nivel de base de datos. Configurar el chars en la tabla en UTF8 generalmente no es suficiente. Todos sus charsets y colmaciones deben estar en orden antes de que los personajes se muevan correctamente alrededor del sistema. Una trampa común se establece incorrectamente charsets de conexión, así que comenzaría allí.

Avíseme si necesita más orientación.

EDITAR

Para verificar qué bytes se almacenan realmente para ese valor, ejecute esta consulta.

SELECT hex( currency_symbol )
  FROM country
 WHERE country_name = 'UK'

Si tú ves A3 Entonces sabes que el personaje se almacena como ISO-8859-1. Esto significa que el problema ocurre durante o antes de escribir en el DB.

Si tú ves C2A3 Entonces sabes que el personaje se almacena como UTF-8. Esto significa que el problema ocurre después de leer el DB y antes de escribir al navegador.

Edición 2

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'your_db_name';

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

Otros consejos

Partiendo en mi 2 peniques. yo suelo UTF8_ENCODE () Para producir los datos de la base de datos. Esto parece cuidar a otros personajes también.

Intenta usar

&pound;

En lugar del símbolo £, alternativamente, donde imprime el signo £, haga:

<%=replace(stringWithPoundInIt,"£","&pound;"%>

Yo tuve el mismo problema. Lo que hice fue ejecutar esto justo después de conectarme a la base de datos (PHP):

mysql_query("SET NAMES utf8");

Espero que esto ayude..

Tuve el mismo problema y lo resolví agregando el siguiente código PHP justo antes de ejecutar la consulta SELECT en la base de datos MySQL.

mysql_query("SET character_set_results=utf8", $link);

Me encontré con este problema y me resolví en la etapa de salida usando "mb_convert_encoding".

Usando tu ejemplo ...

echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");

Puedes ver aquíNo estoy seguro de si funciona, pero pruébalo porque esto es extraño que nunca haya visto algo así antes.

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