web-dev-qa-db-fra.com

Stockage et affichage d'une chaîne unicode (हिन्दी) à l'aide de PHP et MySQL

Je dois stocker du texte hindi dans une base de données MySQL, le récupérer en utilisant un script PHP et l'afficher sur une page Web. J'ai fait ce qui suit:

J'ai créé une base de données et défini son encodage sur UTF-8 ainsi que le classement sur utf8_bin. J'ai ajouté un champ varchar dans la table et l'ai défini pour accepter le texte UTF-8 dans la propriété charset.

Ensuite, je me suis mis à y ajouter des données. Ici, je devais copier des données à partir d'un site existant . Le texte hindi ressemble à ceci: सूर्योदय: 05: 30

J'ai directement copié ce texte dans ma base de données et utilisé le PHP code echo(utf8_encode($string)) pour afficher les données. Ce faisant, le navigateur m'a montré "??????".

Quand j'ai inséré l'équivalent UTF du texte en allant dans "voir la source" dans le navigateur, cependant, सूर्योदय se traduit par सूर्योदय.

Si j'entre et stocke सूर्योदय Dans la base de données, il se convertit parfaitement.

Donc, ce que je veux savoir, c'est comment je peux directement stocker सूर्योदय dans ma base de données et le récupérer et l'afficher dans ma page Web en utilisant PHP.

De plus, quelqu'un peut-il m'aider à comprendre s'il existe un script qui, lorsque je tape सूर्योदय, me donne सूर्योदय?

Solution trouvée

J'ai écrit l'exemple de script suivant qui a fonctionné pour moi. J'espère que ça aide quelqu'un d'autre aussi

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

Le vidage de ma base de données stockant des chaînes utf hindi est

CREATE TABLE `hindi` (
  `data` varchar(1000) character set utf8 collate utf8_bin default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `hindi` VALUES ('सूर्योदय');

Maintenant ma question est, comment cela a-t-il fonctionné sans spécifier "META" ou les informations d'en-tête?

Merci!

46
Anirudh Goel

Avez-vous défini le jeu de caractères approprié dans la section HTML Head?

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

ou vous pouvez définir le type de contenu dans votre script php en utilisant -

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

Il y a déjà quelques discussions ici sur StackOverflow - jetez un œil

Comment faire en sorte que MySQL gère correctement UTF-8configurer utf8 avec mysql via php

PHP/MySQL avec des problèmes d'encodage

Donc, ce que je veux savoir, c'est comment puis-je directement stocker सूर्योदय dans ma base de données et le récupérer et l'afficher dans ma page Web en utilisant PHP.

Je ne suis pas sûr de ce que vous entendez par "stocker directement dans la base de données" .. vouliez-vous dire saisir des données en utilisant PhpMyAdmin ou tout autre outil similaire? Si oui, j'ai essayé d'utiliser PhpMyAdmin pour entrer des données unicode, donc cela a bien fonctionné pour moi - Vous pouvez essayer de saisir des données en utilisant phpmyadmin et de les récupérer en utilisant un script php pour confirmer. Si vous devez soumettre des données via un script Php, définissez simplement les NOMS et CHARACTER SET lorsque vous créez une connexion mysql, avant d'exécuter des requêtes d'insertion et lorsque vous sélectionnez des données. Jetez un œil aux articles ci-dessus pour trouver la syntaxe. J'espère que ça aide.

** MISE À JOUR ** Juste corrigé quelques fautes de frappe, etc.

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

Pour ceux qui recherchent une instruction PDO PHP (> 5.3.5)), nous pouvons définir le jeu de caractères comme suit:

$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

Pour ceux qui rencontrent des difficultés, rendez-vous sur php admin et changez le classement en tf8_general_ci Sélectionnez Table allez dans Opérations >> options de table >> les classements devraient être là

0
Aklesh Singh