27

my table char set is utf8 and it's collation is utf8.now i have this code:

   $mysqli = new mysqli("localhost", "root", "", "Amoozeshgah");

            if (mysqli_connect_errno()) {
                  printf("Connect failed: %s\n", mysqli_connect_error());

            }
          if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
    printf("Current character set: %s\n", $mysqli->character_set_name());
}
        mysql_set_charset('utf8');
            if ($stmt = $mysqli->prepare("SELECT About_Title FROM Tbl_About WHERE About_Id=?")) {
                $city = 8;

               /* bind parameters for markers */
                $stmt->bind_param("s", $city);

              /* execute query */
                $stmt->execute();

               /* bind result variables */

                  $result = $stmt->get_result();

             /* fetch value */
            while ($myrow = $result->fetch_assoc()) {

        // use your $myrow array as you would with any other fetch
        printf("%s is in district %s\n", $city, $myrow['About_Title']);
        print("shod");

    }

but out put is:

Current character set: utf8 8 is in district نتمنتشس shod

what can i do? Edit: i replaced:

if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
    } else {
        printf("Current character set: %s\n", $mysqli->character_set_name());
    }
            mysql_set_charset('utf8');

with

$mysqli->set_charset("utf8")

but no difference.

Mahdi_Nine
  • 14,205
  • 26
  • 82
  • 117

6 Answers6

59

Please replace mysql_set_charset('utf8'); to $mysqli->set_charset("utf8") :-)

Rohit Choudhary
  • 2,253
  • 1
  • 23
  • 34
27
or mysqli_set_charset($this->mysqli,"utf8");
mysqli_set_charset($conn,"utf8");
Rinzler
  • 295
  • 3
  • 5
2

Just in case you use "json_encode" in your code, for example:

json_encode($rows);

simply change it to:

json_encode($rows,JSON_UNESCAPED_UNICODE);
Khalil Youssefi
  • 385
  • 6
  • 10
0

Interesting scenario that may help someone else out. No technical details/explanation and instead just a push/clue in the right direction.

The scenario: remote automated creation of a User Account based on a successful/VERIFIED IPN PayPal Transaction. Mysqli Query creates user and usermeta data, but the value of that data contains hidden formatting characters and invalidates usage of that data called in Form processing. Very simple solution without changing/altering any existing DB Tables. Basically this ensures that your data is only ASCII printable characters and even using $mysqli->set_charset("utf8"); is not really that important since you are preparing your data to be processed and inputted "ASCII clean".

    $create_ipn = $mysqli->prepare("INSERT INTO xxx_somewhere (some_ipn_parameter , email, domain, item) VALUES (?, ?, ?, ?)");
    $create_ipn->bind_param("ssss", $some_ipn_parameter, $email, $domain, $item);

    $some_ipn_parameter = preg_replace( '/[^\x01-\x7F]/', "", 'the_actual_ipn_data' );
    $email = 'edward@ait-pro.com';
    $domain = '';
    $item = 'Test';
    $create_ipn->execute();         
Ed-AITpro
  • 310
  • 1
  • 8
0

When fetching data from database, you do not only get the data correctly, but also need to show it on pages correctly, so try using UTF-8 encoding in your page header:

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

<meta charset="utf-8">

That's my problem and solution, thanks to Rohit Kumar Choudhary.

Kacifer
  • 1,334
  • 17
  • 26
-1

in your php file add the following at the top of your code

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