Символ фунта не отображается на веб-странице - PullRequest
3 голосов
/ 02 июня 2010

У меня есть таблица базы данных mysql для хранения названия страны и символа валюты - для CHARSET правильно установлено значение UTF8.

Это пример данных, вставленных в таблицу

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

Когда я смотрю в базу данных - символ фунта выглядит нормально - но когда я извлекаю его из базы данных и отображаю на веб-сайте - появляется странный квадратный знак с вопросительным знаком внутри вместо символа фунта.

Редактировать В my.cnf - набор символов был установлен на latin1 - я изменил его на utf8 - затем я вошел в систему как root и запустил \ s - он вернул

Server characterset:    utf8
Client characterset:    utf8

1011 * Параметры сортировки *

-- 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

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);
?>

Пожалуйста, совет Спасибо

Ответы [ 7 ]

7 голосов
/ 02 июня 2010

Когда вы видите, что «странный квадратный символ с вопросительным знаком внутри», иначе известный как ЗАМЕНА ХАРАКТЕРА , это, как правило, показатель того, что у вас есть байт в диапазоне 80-FF (128- 255) и система пытается отобразить его в UTF-8.

Весь этот диапазон байтов недопустим для однобайтовых символов в UTF-8, но все они очень распространены в западных кодировках, таких как ISO-8859-1.

Когда я просматриваю вашу страницу и вручную переключаю кодировку символов с UTF-8 на ISO-8859-1 (в Firefox с View >> Character Encoding >> Western (ISO-8859-1)), тогда POUND SIGN отображается правильно.

Так что же тогда не так? Трудно сказать - есть десятки мест, где это можно испортить. Но, скорее всего, это на уровне базы данных. Установка CHARSET на столе в UTF8, как правило, недостаточно. Все ваши кодировки и сопоставления должны быть в порядке, прежде чем персонажи будут правильно перемещаться по системе. Общая ловушка неправильно установлена ​​ кодировки соединения , поэтому я бы начал с нее.

Дайте мне знать, если вам нужно больше указаний.

EDIT

Чтобы проверить, какие байты на самом деле хранятся для этого значения, выполните этот запрос.

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

Если вы видите A3, то вы знаете, что символ сохраняется как ISO-8859-1. Это означает, что проблема возникает во время или перед записью в БД.

Если вы видите C2A3, то вы знаете, что символ сохраняется как UTF-8. Это означает, что проблема возникает после чтения из БД и перед записью в браузер.

РЕДАКТИРОВАТЬ 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';
3 голосов
/ 28 августа 2013

Сколы в моих 2 пенсов. Я использую utf8_encode () для вывода данных из базы данных. Похоже, это касается и других персонажей.

1 голос
/ 02 июля 2013

Я сам столкнулся с этой проблемой и решил на этапе вывода, используя « mb_convert_encoding ».

Используя ваш пример ...

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

1 голос
/ 06 февраля 2012

У меня была та же проблема, и я решил ее, добавив приведенный ниже код PHP непосредственно перед выполнением запроса SELECT для базы данных MySQL.

mysql_query("SET character_set_results=utf8", $link);
1 голос
/ 04 января 2012

У меня была такая же проблема. Я сделал это сразу после подключения к базе данных (PHP):

mysql_query("SET NAMES utf8");

Надеюсь, это поможет ..

1 голос
/ 02 июня 2010

Попробуйте использовать

&pound;

Вместо символа £ альтернативно, где вы печатаете знак £, выполните:

<%=replace(stringWithPoundInIt,"£","&pound;"%>
0 голосов
/ 02 июня 2010

Вы можете проверить здесь . Я не уверен, что это работает, но попробуйте, потому что это странно, я никогда не видел ничего подобного раньше.

...