Вопрос

У меня есть таблица базы данных 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 () для вывода данных из базы данных. Кажется, это также заботится о других персонажах.

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

&pound;

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

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

У меня такая же проблема. То, что я сделал, я запустил это сразу после подключения к базе данных (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");

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top