PHP MySQL UTF-8 Символ евро показан в виде вопросительного знака на бриллианте

Так что после целого дня поиска и отладки я попал сюда.

установите следующую кодировку:

db:  utf8_general_ci
table: utf8_general_ci
column: utf8_general_ci, TEXT

Я вставил некоторые символы евро и некоторые другие странные символы

acentuação

конфиг

$config['charset'] = 'UTF-8';

DSN

char_set=utf8,dbcollat=utf8_general_ci

Я сделал несколько запросов для сравнения

модель

$query = $this->db->query("SET NAMES latin1");
$query = $this->db->query("SELECT shortdesc,HEX(shortdesc) FROM `contracttypes` WHERE id = 4");
$ret['latin1'] =  $query->row();
$query = $this->db->query("SET NAMES utf8");
$query = $this->db->query("SELECT shortdesc,HEX(shortdesc) FROM `contracttypes` WHERE id = 4");
$ret['utf8'] =  $query->row();
return $ret;;

контроллер

public function utfhell()  {
var_dump($this->campagne_model->utfhell());
}

Это выводы

array (size=2)
'latin1' =>
object(stdClass)[34]
public 'shortdesc' => string 'acentua��o �����' (length=16)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)
'utf8' =>
object(stdClass)[33]
public 'shortdesc' => string 'acentuação €€€€€' (length=28)
public 'HEX(shortdesc)' => string '6163656E747561C3A7C3A36F20E282ACE282ACE282ACE282ACE282AC' (length=56)

Пока все хорошо, на

<?php header('Content-Type: text/html; charset="utf-8"', true); ?>
<!doctype html>
<html>
<head>
<title>UTFhell</title>
<link rel="stylesheet" href="../assets/css/style.css"/>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
...
<?php
echo 'Original : ', $campagne_info->contractName->shortdesc."<br />";
echo 'UTF8 Encode : ', utf8_encode($campagne_info->contractName->shortdesc)."<br />";
echo 'UTF8 Decode : ', utf8_decode($campagne_info->contractName->shortdesc)."<br />";
echo 'TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//TRANSLIT", $campagne_info->contractName->shortdesc)."<br />";
echo 'IGNORE TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//IGNORE//TRANSLIT", $campagne_info->contractName->shortdesc)."<br />";
echo 'IGNORE   : ', iconv("ISO-8859-1", "UTF-8//IGNORE", $campagne_info->contractName->shortdesc)."<br />";
echo 'Plain: ', iconv("ISO-8859-1", "UTF-8", $campagne_info->contractName->shortdesc)."<br />";
echo '€€€€€€€€€€<br>';
?>

Ни один из них не показывает мне нормальный символ евро, кроме последнего эхо-заявления, все они дают мне алмазы с вопросительным знаком для евросимволов

2

Решение

HEX является кодировкой utf8 для этой строки. Таким образом, данные в таблице «правильно».

Черный бриллиант ( ) это браузерный способ сказать wtf. Это происходит от наличия символов латинского алфавита, но говорит браузеру
для отображения utf8 символов.

Вы мог попросите браузер отобразить «Western», чтобы избежать основных проблем.
Помните, цель состоит в том, чтобы действительно использовать utf8.

Иногда это происходит вместе с вопросительными знаками, и в этом случае вы должны начать все сначала.

Причина (вероятно):

  1. Байты, которые вы имели, были закодированы как latin1. Вы их где-то приобрели — дамп файла, онлайн ввод и т. Д.
  2. Параметры подключения сказал latin1.
  3. Столбец / таблица объявлены как CHARACTER SET с указанием utf8, поэтому во время INSERT они были правильно преобразованы.
  4. При ВЫБОРе настройка на шаге 2 снова была латинской1, поэтому они были преобразованы обратно в латинскую1.
  5. При отображении текста на веб-странице заголовок страницы говорит, что байты были utf8.

Решение, План А: (Небрежно, но, вероятно, работоспособно)

Измените # 5, скажем, соответствующий эквивалент latin1.

Решение, план Б:

  1. Исправить источник, чтобы быть в кодировке utf8
  2. query("SET NAMES utf8") (если нет способа установить его во время подключения)
  3. Оставьте таблицу / столбец в CHARACTER SET utf8
  4. Шаг 2 покрыть это.
  5. Покидать <meta ... UTF-*>,
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]