web-dev-qa-db-ja.com

PHPおよびMySQLを使用したUnicode文字列(हिन्दी)の保存と表示

ヒンディー語のテキストをMySQLデータベースに保存し、PHPスクリプトを使用してフェッチし、Webページに表示する必要があります。以下を実行しました。

データベースを作成し、エンコードをUTF-8に設定し、照合順序を_utf8_bin_に設定しました。テーブルにvarcharフィールドを追加し、charsetプロパティでUTF-8テキストを受け入れるように設定しました。

次に、データを追加します。ここでは、 既存のサイト からデータをコピーする必要がありました。ヒンディー語のテキストは次のようになります。सूर्योदय:05:30

このテキストをデータベースに直接コピーし、PHP code echo(utf8_encode($string))]を使用してデータを表示しました。そうすると、ブラウザーに「??????」と表示されました。

ただし、ブラウザの「ソースを表示」に移動してテキストのUTF相当を挿入すると、Whenर्योदयは_सूर्योदय_に変換されます。

_सूर्योदय_を入力してデータベースに保存すると、完全に変換されます。

したがって、私が知りたいのは、PHPを使用してデータベースに直接格納し、それをフェッチしてWebページに表示する方法です。

また、「सूर्योदय」と入力すると_सूर्योदय_が表示されるスクリプトがある場合、だれでも理解できるでしょうか。

ソリューションが見つかりました

私は次のサンプルスクリプトを作成しました。それが他の誰かにも役立つことを願っています

_<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」またはヘッダー情報を指定せずにどのように機能したのですか?

ありがとう!

46
Anirudh Goel

HTML Headセクションで適切な文字セットを設定しましたか?

<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を設定するだけです。上記の投稿を見て構文を見つけてください。それが役に立てば幸い。

**更新**タイプミスなどを修正しました

37
TigerTiger
<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>
22
ROSE

PHP(> 5.3.5)PDOステートメントを探している人のために、以下のように文字セットを設定できます。

$dbh = new PDO('mysql:Host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
7
Sandeep
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('कंप्यूटर');
1
Vinod Tiwari

困難に直面している人のために、php adminに行き、照合をtf8_general_ciに変更してください。

0
Aklesh Singh