Символ фунта не отображается на веб -странице
-
23-10-2019 - |
Вопрос
У меня есть таблица базы данных MySQL для хранения имени страны и символа валюты - Charset правильно установлен на UTF8.
Это пример данных, вставленные в таблицу
insert into country ( country_name, currency_name, currency_code, currency_symbol) values ('UK','Pounds','GBP','£');
Когда я смотрю в базу данных - символ фунта появляется нормально - но когда я получаю его из базы данных и отображаю его на веб -сайте - странный квадратный символ отображается с вопросительным знаком внутри вместо символа фунта.
Редактировать в my.cnf - символ был установлен на Latin1 - я изменил его на UTF8 - затем я вошел в систему как root и Ran S - он вернулся
Server characterset: utf8 Client characterset: utf8
Собрание
-- 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); ?>
Пожалуйста, посоветуйте спасибо
Решение
Когда вы видите этот «странный квадратный символ с вопросительным знаком внутри», иначе известный как Запасной символ, как правило, это показатель того, что у вас есть байт в диапазоне 80-FF (128-255), и система пытается отображать его в UTF-8.
Весь этот байт-диапазон недействителен для одиночных символов в UTF-8, но все это очень распространено в западных кодировках, таких как ISO-8859-1.
Когда я просматриваю вашу страницу и вручную переключаю кодировку персонажа с UTF-8 на ISO-8859-1 (в Firefox с View
>> Character Encoding
>> Western (ISO-8859-1)
) тогда ЗНАК ФУНТА СТЕРЛИНГОВ отображается правильно.
Итак, что тогда не так? Трудно сказать - есть десятки мест, где это может быть загрязнено. Но, скорее всего, это на уровне базы данных. Установка Charset на таблице в UTF8, как правило, недостаточно. Все ваши чары и коллекции должны быть в порядке, прежде чем символы будут правильно перемещаться по системе. Распространенная ловушка неправильно установлена подключение к Charsets, так что я бы начал там.
Дайте мне знать, если вам нужно больше руководства.
РЕДАКТИРОВАТЬ
Чтобы проверить, какие байты на самом деле хранятся для этого значения, запустите этот запрос.
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';
Другие советы
Чисти в моих 2 пенсах. я использую utf8_encode () для вывода данных из базы данных. Кажется, это также заботится о других персонажах.
Попробуйте использовать
£
Вместо символа £, альтернативно, где вы печатаете знак, делайте:
<%=replace(stringWithPoundInIt,"£","£"%>
У меня такая же проблема. То, что я сделал, я запустил это сразу после подключения к базе данных (PHP):
mysql_query("SET NAMES utf8");
Надеюсь это поможет..
У меня была такая же проблема, и я решил ее, добавив приведенный ниже PHP -код непосредственно перед запуском запроса Select в базе данных MySQL.
mysql_query("SET character_set_results=utf8", $link);
Я сам столкнулся с этой проблемой и решил на выходе, используя "mb_convert_encoding".
Используя ваш пример ...
echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");
Вы можете проверить здесь. Я не уверен, работает ли это, но попробуйте, потому что это странно, я никогда не видел ничего подобного раньше.