Сохранение и отображение строки unicode (हिन्दी) с использованием PHP и MySQL
Мне нужно хранить хинди-текст в базе данных MySQL, извлекать его с помощью PHP script и отображать его на веб-странице. Я сделал следующее:
Я создал базу данных и установил ее кодировку в UTF-8, а также сопоставление с utf8_bin
.
Я добавил поле varchar в таблицу и установил, чтобы он принял текст UTF-8 в свойстве charset.
Затем я решил добавить к нему данные. Здесь мне пришлось копировать данные из существующего сайта.
Текст хинди выглядит так: सूर्योदय: 05: 30
Я прямо скопировал этот текст в свою базу данных и использовал код PHP echo(utf8_encode($string))
для отображения данных. После этого браузер показал мне "??????".
Когда я вставил эквивалент UTF текста, перейдя в "просмотр источника" в браузере, однако, सूर्योदय переводит на सूर्योदय
.
Если я вхожу и сохраняю सूर्योदय
в базе данных, он отлично преобразуется.
Итак, я хочу знать, как я могу напрямую хранить सूर्योदय в своей базе данных и извлекать ее и отображать на моей веб-странице с помощью PHP.
Кроме того, может ли кто-нибудь помочь мне понять, существует ли script, который при вводе в सूर्योदय дает мне सूर्योदय
?
найденное решение
Я написал следующий образец script, который работал у меня. Надеюсь, это тоже поможет кому-то еще.
<html>
<head>
<title>Hindi</title></head>
<body>
<?php
include("connection.php"); //simple connection setting
$result = mysql_query("SET NAMES utf8"); //the main trick
$cmd = "select * from hindi";
$result = mysql_query($cmd);
while ($myrow = mysql_fetch_row($result))
{
echo ($myrow[0]);
}
?>
</body>
</html>
Дамп для моей базы данных, хранящей строки hindi utf,
CREATE TABLE `hindi` (
`data` varchar(1000) character set utf8 collate utf8_bin default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `hindi` VALUES ('सूर्योदय');
Теперь мой вопрос: как он работал без указания "META" или информации заголовка?
Спасибо!
Ответы
Ответ 1
Вы установили правильную кодировку в разделе HTML Head?
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
или вы можете установить тип контента в своем php script, используя -
header( 'Content-Type: text/html; charset=utf-8' );
В StackOverflow уже есть обсуждения, пожалуйста, посмотрите
Как заставить MySQL правильно обрабатывать UTF-8
установка utf8 с помощью mysql через php
PHP/MySQL с проблемами кодирования
Так что я хочу знать, как я могу прямо храните सूर्योदय в мой базы данных и получить его и отобразить в моя веб-страница с использованием PHP.
Я не уверен, что вы подразумеваете под "непосредственным хранением в базе данных". Вы имели в виду ввод данных с использованием PhpMyAdmin или любого другого подобного инструмента? Если да, я попытался использовать PhpMyAdmin для ввода данных в Юникоде, поэтому он отлично справился со мной - вы можете попробовать ввести данные с помощью phpmyadmin и получить его с помощью php script для подтверждения. Если вам необходимо отправить данные с помощью PHP скрипт, просто установите NAMES и CHARACTER SET, когда вы создаете соединение mysql, перед выполнением запросов на вставку и при выборе данных. Взгляните на приведенные выше сообщения, чтобы найти синтаксис. Надеюсь, что это поможет.
** ОБНОВЛЕНИЕ **
Просто исправлены некоторые опечатки и т.д.
Ответ 2
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_query('SET character_set_results=utf8');
mysql_query('SET names=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_results=utf8');
mysql_query('SET collation_connection=utf8_general_ci');
mysql_select_db('onlinetest',$con);
$nith = "CREATE TABLE IF NOT EXISTS `TAMIL` (
`data` varchar(1000) character set utf8 collate utf8_bin default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1";
if (!mysql_query($nith,$con))
{
die('Error: ' . mysql_error());
}
$nithi = "INSERT INTO `TAMIL` VALUES ('இந்தியா நாட்டின் பக்கங்கள்')";
if (!mysql_query($nithi,$con))
{
die('Error: ' . mysql_error());
}
$result = mysql_query("SET NAMES utf8");//the main trick
$cmd = "select * from TAMIL";
$result = mysql_query($cmd);
while($myrow = mysql_fetch_row($result))
{
echo ($myrow[0]);
}
?>
</body>
</html>
Ответ 3
Для тех, кто ищет PHP ( > 5.3.5) инструкцию PDO, мы можем установить кодировку, как показано ниже:
$dbh = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
Ответ 4
CREATE DATABASE hindi_test
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
USE hindi_test;
CREATE TABLE `hindi` (`data` varchar(200) COLLATE utf8_unicode_ci NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `hindi` (`data`) VALUES('कंप्यूटर');
Ответ 5
Для тех, кто сталкивается с трудностями, просто зайдите в php admin и измените параметры сортировки на utf8_general_ci
Выберите Таблица, перейдите к Операциям >> Параметры таблицы >> Должны быть сопоставления