Проблема с PHP и Mysql UTF-8 (специальный символ) - PullRequest
12 голосов
/ 16 августа 2011

У меня есть форма с одним текстовым полем с именем (ProductTitle)

, если я напишу в качестве примера "Étuit" в текстовое поле и нажму "Сохранить", я отправлю данные в таблицу с именем Product.Результат в базе данных для ProductTitle - ‰ tuit.Меня беспокоит особый характер.Вместо того, чтобы поместить É в базу данных, я получил Ã ‰

Когда я загружаю название продукта («Étuit») из базы данных в промежуток.Это показывают правильно.НО, когда я загружаю его в текстовое поле для редактирования названия продукта, это показывает ‰ ‰ tuit.

Кто-нибудь знает, почему.

Я помещаю это в заголовок HTML

<head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Примечание: Когда я нажимаю сохранить в форме, данные публикуются с помощью метода jquery ajax.

Ответы [ 8 ]

10 голосов
/ 16 августа 2011

Попробуйте установить кодировку клиента перед использованием БД.

mysql_query("SET NAMES 'utf8'");

Если вышеперечисленное не работает, используйте функции кодирования / декодирования utf8:

<?
$string ="Étuit";
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<?
echo $string; // echo's '?tuit'
echo utf8_encode($string); // echo's 'Étuit'
?>
9 голосов
/ 16 августа 2011

Вероятно, происходит то, что набор символов по умолчанию для клиента не установлен в UTF-8, поэтому вы получаете транспозицию в одном или другом направлении.Это рассматривается различными способами здесь:

Часто запрос инициализации «SET NAMES utf8» сразу после создания соединения решит проблему в будущем, но убедитесь, чтовы думаете, что хранится (utf8) на самом деле то, что было сохранено.У вас может быть работа по уборке, если нет.

7 голосов
/ 16 августа 2011

Взгляните на utf8_encode () и utf8_decode () .Также взгляните на многобайтовые строковые функции .

0 голосов
/ 18 августа 2018

У меня тоже были трудности с этим, но у меня всегда работает следующее! Прежде чем манипулировать данными, убедитесь, что кодировка установлена ​​следующим образом:

try{
  $dbh = new PDO($dsn, $user, $pass);
  $dbh->query("SET NAMES 'utf8'");
  print "Connected";
 }

catch(PDOException $e){
  print "Error!!   " . $e->getMessage()."<br/>";
  die();
 }
0 голосов
/ 23 августа 2017

Я просто использую метод set_charset, когда использую mysqli lib.

error_reporting(E_ALL);

$mysqli = new mysqli('localhost', 'login', "pass", 'database');

if ( ! $mysqli->set_charset("utf8") )
{
   printf("Error loading character set utf8: %s\n", $mysqli->error);
}
0 голосов
/ 11 февраля 2016

Это работает для меня:

В заголовках HTML:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

После подключения PHP:

$conexion = @mysql_connect($servidor, $usuario, $contrasenha);
mysql_select_db($BD, $conexion) or die(mysql_error($conexion));
mysql_query("SET NAMES 'utf8'");
0 голосов
/ 17 апреля 2014

В этом посте объясняется, как настроить и работать с UTF-8 в PHP и MySQL. Надеюсь, это сэкономит ваше время.

Учебник по UTF-8 для PHP и MySQL

0 голосов
/ 03 ноября 2013

Чтобы не беспокоиться о SET NAMES перед каждым подключением в коде, можно использовать параметр в строке подключения mysql:

"jdbc:mysql://hostAddress:port/databaseName?characterEncoding=UTF-8"
...