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

Posted

技术标签:

【中文标题】使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)【英文标题】:Storing and displaying unicode string (हिन्दी) using PHP and MySQL 【发布时间】:2010-11-14 23:36:23 【问题描述】:

我必须将印地语文本存储在 mysql 数据库中,使用 php 脚本获取它并将其显示在网页上。我做了以下事情:

我创建了一个数据库并将其编码设置为 UTF-8,并将排序规则设置为 utf8_bin。 我在表中添加了一个 varchar 字段,并在 charset 属性中将其设置为接受 UTF-8 文本。

然后我开始向它添加数据。在这里,我不得不从existing site 复制数据。 印地语文本如下所示:सूर्योदय: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”或标题信息,它是如何工作的?

谢谢!

【问题讨论】:

【参考方案1】:

您是否在 HTML Head 部分设置了正确的字符集?

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

或者您可以使用 -

在 php 脚本中设置内容类型
   header( 'Content-Type: text/html; charset=utf-8' ); 

这里已经有一些关于 *** 的讨论 - 请看一下

How to make MySQL handle UTF-8 properly setting utf8 with mysql through php

PHP/MySQL with encoding problems

所以我想知道的是我怎么能 直接将सूर्योदय存入我的 数据库并获取它并显示在 我的网页使用 PHP。

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

** 更新 ** 只是修正了一些错别字等

【讨论】:

另外:***.com/questions/1085093/… 我不确定.. 你之前的字符集是什么? 最好使用 mysql_set_charset() 而不是 'SET NAMES',否则 mysql_real_escape_string() 不知道这个变化。 php.net/mysql_set_charset【参考方案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>

【讨论】:

正是我想要的。感谢您的代码!我相信 mysql_query('SET character_set_results=utf8'); 足以显示 unicode 字符? 如何在 mysql 控制台中显示 kannada 字体我的查询“INSERT INTO lang values ('ಕನ್ನಡ ಸತ್ಯ ಕನ್ನಡ ನಿತ್ಯ')”;【参考方案3】:【参考方案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 选择表转到操作>>表选项>>排序规则应该在那里

【讨论】:

以上是关于使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 数据库中存储和检索图像并使用 Php 将其显示在 html 中? [复制]

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

逐步存储textarea mysql php

上传和下载 PHP MySQL 脚本

如何使用 PHP 和 MYSQL 在单个单元格数据库中插入/存储多个项目

使用PHP加密图像以便在MySQL BLOB中存储然后解密和打印