使用PHP和MySQL存储和显示Unicode字符串(हिन्दी)

49
我必须在MySQL数据库中存储印地文本,使用PHP脚本获取它并在网页上显示它。 我做了以下事情:
我创建了一个数据库,并将其编码设置为UTF-8,以及将排序规则设置为utf8_bin。 我在表中添加了一个varchar字段,并将其设置为接受字符集属性中的UTF-8文本。
然后我开始添加数据。 这里我不得不从现有站点复制数据。 印地文本看起来像这样: सूर्योदय:05:30
我直接将此文本复制到我的数据库中,并使用PHP代码echo(utf8_encode($string))显示数据。 这样做后,浏览器显示了"??????"。
但是,如果我通过在浏览器中查看源代码来插入文本的UTF等效项,则 सूर्योदय会被翻译为सूर्योदय
如果我在数据库中输入并存储सूर्योदय,它将完美转换。
所以我想知道如何直接将“सूर्योदय”存储到我的数据库中,并使用PHP获取它并在我的网页上显示它。 另外,有人可以帮助我理解是否有一种脚本,当我输入“सूर्योदय”时,会给我सूर्योदय吗? 我写了以下示例脚本,对我有用。 希望它也能帮助其他人。
<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>

我存储印地语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”或头信息的情况下,它是如何工作的?
谢谢!
5个回答

41

你在HTML头部设置了正确的字符集吗?

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

或者你可以在你的PHP脚本中设置内容类型,使用如下:

   header( 'Content-Type: text/html; charset=utf-8' ); 

在StackOverflow上已经有一些讨论了 - 请看看

如何使MySQL正确处理UTF-8 通过php设置mysql的utf8

PHP / MySQL字符编码问题

  

所以我想知道怎么样才能直接把“ सूर्योदय”存储到我的数据库中,然后使用PHP获取它并在我的网页上显示。

我不确定你所说的“直接存储到数据库”是什么意思..你是指使用PhpMyAdmin或任何类似的工具输入数据吗?如果是这样,我尝试使用PhpMyAdmin输入Unicode数据,所以对我来说效果很好 - 你可以尝试使用phpmyadmin输入数据,并使用php脚本检索它以确认。如果您需要通过Php脚本提交数据,请在执行插入查询之前,在创建mysql连接时设置NAMES和CHARACTER SET,在选择数据时也要设置。查看上面的帖子以查找语法。希望有所帮助。

**更新** 修复了一些拼写错误等


同时:https://dev59.com/5kjSa4cB1Zd3GeqPEEp5 - deceze
我不确定...你之前的字符集是什么? - TigerTiger
最好使用mysql_set_charset()代替'SET NAMES',否则mysql_real_escape_string()无法意识到这种变化。http://php.net/mysql_set_charset - VolkerK

24
<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>

2
正是我所需要的。感谢您提供代码!我相信只需要 mysql_query('SET character_set_results=utf8'); 就足以显示 Unicode 字符了? - mccbala
如何在MySQL控制台中显示卡纳达语字体,我的查询为“INSERT INTO lang values ('ಕನ್ನಡ ಸತ್ಯ ಕನ್ನಡ ನಿತ್ಯ')”; - Naveen Kumar

9

对于那些寻找PHP (>5.3.5) PDO语句的人,我们可以按照以下方式设置字符集:

$dbh = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

1
这对我有效,同时不要忘记在头部添加<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">。 - suraj

2
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('कंप्यूटर');

2

对于那些遇到困难的人,只需进入php管理员并将排序规则更改为utf8_general_ci。选择表格,进入操作>>表选项>>应该会有排序规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接